summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortoofar <toofar@spalge.com>2022-06-26 13:37:08 +1200
committertoofar <toofar@spalge.com>2022-06-26 13:37:08 +1200
commitf7d53a5c302a4bb5b7bd0a52b3b088a719519fbf (patch)
tree2da614cf35abfc8db0cb467086993549f96b81b7
parentec2bb03ae6a1dd4443829f38d896af51fa857557 (diff)
downloadqutebrowser-f7d53a5c302a4bb5b7bd0a52b3b088a719519fbf.tar.gz
qutebrowser-f7d53a5c302a4bb5b7bd0a52b3b088a719519fbf.zip
Re-write PyQt references to always include the module
Still some manual fixes to make, see #995 and linked PRs. This was done like: date ; for mod in core dbus gui network printsupport qml sql webengine webenginecore webenginewidgets webkit webkitwidgets widgets test opengl; do echo "renaming $mod" python3 -m libcst.tool codemod rename_pyqt.RenameCommand qutebrowser/ tests --old_name=qutebrowser.qt.$mod.* --new_name=qutebrowser.qt:$mod.* --no-format done ; date Where the list of modules was obtained from the current pyqt5/pqyt6/pyside2 import wrapper machinery. That list of modules to include can also be obtained using semgrep like so (it might miss out the QtTest module for some reason): semgrep --lang=py -e 'from qutebrowser.qt.$SUBMODULE import ($IMPORTEES)' -o findings.json --json qutebrowser scripts/ tests/ and then with open("findings.json") as f: data=json.load(f) results = data['results'] submodules = sorted(set(r['extra']['metavars']['$SUBMODULE']['abstract_content'] for r in results)) for m in submodules: print(m
-rw-r--r--qutebrowser/api/config.py4
-rw-r--r--qutebrowser/api/downloads.py11
-rw-r--r--qutebrowser/app.py35
-rw-r--r--qutebrowser/browser/browsertab.py170
-rw-r--r--qutebrowser/browser/commands.py70
-rw-r--r--qutebrowser/browser/downloads.py103
-rw-r--r--qutebrowser/browser/downloadview.py34
-rw-r--r--qutebrowser/browser/eventfilter.py33
-rw-r--r--qutebrowser/browser/greasemonkey.py13
-rw-r--r--qutebrowser/browser/hints.py46
-rw-r--r--qutebrowser/browser/history.py44
-rw-r--r--qutebrowser/browser/inspector.py26
-rw-r--r--qutebrowser/browser/navigate.py28
-rw-r--r--qutebrowser/browser/network/pac.py53
-rw-r--r--qutebrowser/browser/network/proxy.py20
-rw-r--r--qutebrowser/browser/pdfjs.py19
-rw-r--r--qutebrowser/browser/qtnetworkdownloads.py64
-rw-r--r--qutebrowser/browser/qutescheme.py80
-rw-r--r--qutebrowser/browser/shared.py23
-rw-r--r--qutebrowser/browser/signalfilter.py4
-rw-r--r--qutebrowser/browser/urlmarks.py13
-rw-r--r--qutebrowser/browser/webelem.py51
-rw-r--r--qutebrowser/browser/webengine/certificateerror.py12
-rw-r--r--qutebrowser/browser/webengine/interceptor.py63
-rw-r--r--qutebrowser/browser/webengine/notification.py188
-rw-r--r--qutebrowser/browser/webengine/tabhistory.py11
-rw-r--r--qutebrowser/browser/webengine/webenginedownloads.py51
-rw-r--r--qutebrowser/browser/webengine/webengineelem.py27
-rw-r--r--qutebrowser/browser/webengine/webengineinspector.py17
-rw-r--r--qutebrowser/browser/webengine/webenginequtescheme.py44
-rw-r--r--qutebrowser/browser/webengine/webenginesettings.py121
-rw-r--r--qutebrowser/browser/webengine/webenginetab.py207
-rw-r--r--qutebrowser/browser/webengine/webview.py62
-rw-r--r--qutebrowser/browser/webkit/cache.py4
-rw-r--r--qutebrowser/browser/webkit/certificateerror.py7
-rw-r--r--qutebrowser/browser/webkit/cookies.py14
-rw-r--r--qutebrowser/browser/webkit/http.py4
-rw-r--r--qutebrowser/browser/webkit/mhtml.py14
-rw-r--r--qutebrowser/browser/webkit/network/networkmanager.py41
-rw-r--r--qutebrowser/browser/webkit/network/networkreply.py40
-rw-r--r--qutebrowser/browser/webkit/network/webkitqutescheme.py21
-rw-r--r--qutebrowser/browser/webkit/tabhistory.py11
-rw-r--r--qutebrowser/browser/webkit/webkitelem.py46
-rw-r--r--qutebrowser/browser/webkit/webkithistory.py6
-rw-r--r--qutebrowser/browser/webkit/webkitinspector.py14
-rw-r--r--qutebrowser/browser/webkit/webkitsettings.py111
-rw-r--r--qutebrowser/browser/webkit/webkittab.py228
-rw-r--r--qutebrowser/browser/webkit/webpage.py100
-rw-r--r--qutebrowser/browser/webkit/webview.py40
-rw-r--r--qutebrowser/commands/argparser.py4
-rw-r--r--qutebrowser/commands/runners.py13
-rw-r--r--qutebrowser/commands/userscripts.py32
-rw-r--r--qutebrowser/completion/completer.py14
-rw-r--r--qutebrowser/completion/completiondelegate.py111
-rw-r--r--qutebrowser/completion/completionwidget.py29
-rw-r--r--qutebrowser/completion/models/completionmodel.py41
-rw-r--r--qutebrowser/completion/models/filepathcategory.py17
-rw-r--r--qutebrowser/completion/models/histcategory.py7
-rw-r--r--qutebrowser/completion/models/listcategory.py16
-rw-r--r--qutebrowser/completion/models/urlmodel.py4
-rw-r--r--qutebrowser/components/braveadblock.py6
-rw-r--r--qutebrowser/components/hostblock.py4
-rw-r--r--qutebrowser/components/misccommands.py11
-rw-r--r--qutebrowser/components/readlinecommands.py13
-rw-r--r--qutebrowser/components/utils/blockutils.py15
-rw-r--r--qutebrowser/config/config.py13
-rw-r--r--qutebrowser/config/configcommands.py11
-rw-r--r--qutebrowser/config/configfiles.py26
-rw-r--r--qutebrowser/config/configinit.py4
-rw-r--r--qutebrowser/config/configtypes.py60
-rw-r--r--qutebrowser/config/configutils.py14
-rw-r--r--qutebrowser/config/qtargs.py4
-rw-r--r--qutebrowser/config/stylesheet.py13
-rw-r--r--qutebrowser/config/websettings.py17
-rw-r--r--qutebrowser/extensions/interceptors.py8
-rw-r--r--qutebrowser/extensions/loader.py4
-rw-r--r--qutebrowser/keyinput/basekeyparser.py52
-rw-r--r--qutebrowser/keyinput/eventfilter.py24
-rw-r--r--qutebrowser/keyinput/keyutils.py301
-rw-r--r--qutebrowser/keyinput/modeman.py42
-rw-r--r--qutebrowser/keyinput/modeparsers.py65
-rw-r--r--qutebrowser/mainwindow/mainwindow.py64
-rw-r--r--qutebrowser/mainwindow/messageview.py34
-rw-r--r--qutebrowser/mainwindow/prompt.py99
-rw-r--r--qutebrowser/mainwindow/statusbar/bar.py40
-rw-r--r--qutebrowser/mainwindow/statusbar/clock.py7
-rw-r--r--qutebrowser/mainwindow/statusbar/command.py38
-rw-r--r--qutebrowser/mainwindow/statusbar/keystring.py4
-rw-r--r--qutebrowser/mainwindow/statusbar/percentage.py7
-rw-r--r--qutebrowser/mainwindow/statusbar/progress.py14
-rw-r--r--qutebrowser/mainwindow/statusbar/searchmatch.py4
-rw-r--r--qutebrowser/mainwindow/statusbar/tabindex.py4
-rw-r--r--qutebrowser/mainwindow/statusbar/textbase.py18
-rw-r--r--qutebrowser/mainwindow/statusbar/url.py13
-rw-r--r--qutebrowser/mainwindow/tabbedbrowser.py98
-rw-r--r--qutebrowser/mainwindow/tabwidget.py166
-rw-r--r--qutebrowser/mainwindow/windowundo.py8
-rw-r--r--qutebrowser/misc/autoupdate.py13
-rw-r--r--qutebrowser/misc/backendproblem.py51
-rw-r--r--qutebrowser/misc/cmdhistory.py9
-rw-r--r--qutebrowser/misc/consolewidget.py30
-rw-r--r--qutebrowser/misc/crashdialog.py88
-rw-r--r--qutebrowser/misc/crashsignal.py31
-rw-r--r--qutebrowser/misc/earlyinit.py36
-rw-r--r--qutebrowser/misc/editor.py21
-rw-r--r--qutebrowser/misc/guiprocess.py64
-rw-r--r--qutebrowser/misc/httpclient.py27
-rw-r--r--qutebrowser/misc/ipc.py65
-rw-r--r--qutebrowser/misc/keyhintwidget.py18
-rw-r--r--qutebrowser/misc/lineparser.py9
-rw-r--r--qutebrowser/misc/miscwidgets.py86
-rw-r--r--qutebrowser/misc/msgbox.py15
-rw-r--r--qutebrowser/misc/pastebin.py13
-rw-r--r--qutebrowser/misc/quitter.py13
-rw-r--r--qutebrowser/misc/savemanager.py11
-rw-r--r--qutebrowser/misc/sessions.py22
-rw-r--r--qutebrowser/misc/sql.py31
-rw-r--r--qutebrowser/misc/throttle.py6
-rw-r--r--qutebrowser/misc/utilcmds.py9
-rw-r--r--qutebrowser/utils/debug.py28
-rw-r--r--qutebrowser/utils/error.py4
-rw-r--r--qutebrowser/utils/jinja.py6
-rw-r--r--qutebrowser/utils/log.py26
-rw-r--r--qutebrowser/utils/message.py19
-rw-r--r--qutebrowser/utils/objreg.py15
-rw-r--r--qutebrowser/utils/qtutils.py119
-rw-r--r--qutebrowser/utils/standarddir.py57
-rw-r--r--qutebrowser/utils/urlmatch.py6
-rw-r--r--qutebrowser/utils/urlutils.py81
-rw-r--r--qutebrowser/utils/usertypes.py32
-rw-r--r--qutebrowser/utils/utils.py32
-rw-r--r--qutebrowser/utils/version.py50
-rw-r--r--tests/conftest.py8
-rw-r--r--tests/end2end/conftest.py12
-rw-r--r--tests/end2end/features/test_downloads_bdd.py4
-rw-r--r--tests/end2end/features/test_editor_bdd.py10
-rw-r--r--tests/end2end/fixtures/notificationserver.py44
-rw-r--r--tests/end2end/fixtures/quteprocess.py17
-rw-r--r--tests/end2end/fixtures/test_testprocess.py4
-rw-r--r--tests/end2end/fixtures/testprocess.py25
-rw-r--r--tests/end2end/fixtures/webserver.py6
-rw-r--r--tests/end2end/test_dirbrowser.py6
-rw-r--r--tests/end2end/test_invocations.py16
-rw-r--r--tests/helpers/fixtures.py32
-rw-r--r--tests/helpers/messagemock.py12
-rw-r--r--tests/helpers/stubs.py88
-rw-r--r--tests/helpers/test_helper_utils.py10
-rw-r--r--tests/helpers/testutils.py6
-rw-r--r--tests/unit/browser/test_browsertab.py6
-rw-r--r--tests/unit/browser/test_caret.py4
-rw-r--r--tests/unit/browser/test_downloadview.py6
-rw-r--r--tests/unit/browser/test_hints.py8
-rw-r--r--tests/unit/browser/test_history.py139
-rw-r--r--tests/unit/browser/test_inspector.py6
-rw-r--r--tests/unit/browser/test_navigate.py48
-rw-r--r--tests/unit/browser/test_notification.py31
-rw-r--r--tests/unit/browser/test_pdfjs.py14
-rw-r--r--tests/unit/browser/test_qutescheme.py48
-rw-r--r--tests/unit/browser/test_signalfilter.py14
-rw-r--r--tests/unit/browser/test_urlmarks.py26
-rw-r--r--tests/unit/browser/webengine/test_webengine_cookies.py11
-rw-r--r--tests/unit/browser/webengine/test_webenginedownloads.py4
-rw-r--r--tests/unit/browser/webengine/test_webengineinterceptor.py6
-rw-r--r--tests/unit/browser/webengine/test_webview.py8
-rw-r--r--tests/unit/browser/webkit/http/test_http.py4
-rw-r--r--tests/unit/browser/webkit/network/test_filescheme.py15
-rw-r--r--tests/unit/browser/webkit/network/test_networkreply.py24
-rw-r--r--tests/unit/browser/webkit/network/test_pac.py34
-rw-r--r--tests/unit/browser/webkit/test_cache.py43
-rw-r--r--tests/unit/browser/webkit/test_certificateerror.py11
-rw-r--r--tests/unit/browser/webkit/test_cookies.py10
-rw-r--r--tests/unit/browser/webkit/test_tabhistory.py32
-rw-r--r--tests/unit/browser/webkit/test_webkitelem.py95
-rw-r--r--tests/unit/commands/test_argparser.py4
-rw-r--r--tests/unit/commands/test_userscripts.py4
-rw-r--r--tests/unit/completion/test_completer.py4
-rw-r--r--tests/unit/completion/test_completiondelegate.py24
-rw-r--r--tests/unit/completion/test_completionmodel.py4
-rw-r--r--tests/unit/completion/test_completionwidget.py4
-rw-r--r--tests/unit/completion/test_models.py110
-rw-r--r--tests/unit/components/test_blockutils.py6
-rw-r--r--tests/unit/components/test_braveadblock.py24
-rw-r--r--tests/unit/components/test_hostblock.py24
-rw-r--r--tests/unit/components/test_readlinecommands.py9
-rw-r--r--tests/unit/config/test_config.py11
-rw-r--r--tests/unit/config/test_configcommands.py12
-rw-r--r--tests/unit/config/test_configfiles.py6
-rw-r--r--tests/unit/config/test_configtypes.py94
-rw-r--r--tests/unit/config/test_configutils.py37
-rw-r--r--tests/unit/config/test_qtargs_locale_workaround.py4
-rw-r--r--tests/unit/config/test_stylesheet.py4
-rw-r--r--tests/unit/javascript/conftest.py8
-rw-r--r--tests/unit/javascript/test_greasemonkey.py10
-rw-r--r--tests/unit/javascript/test_js_execution.py22
-rw-r--r--tests/unit/javascript/test_js_quirks.py12
-rw-r--r--tests/unit/keyinput/key_data.py6
-rw-r--r--tests/unit/keyinput/test_basekeyparser.py90
-rw-r--r--tests/unit/keyinput/test_bindingtrie.py30
-rw-r--r--tests/unit/keyinput/test_keyutils.py327
-rw-r--r--tests/unit/keyinput/test_modeman.py24
-rw-r--r--tests/unit/keyinput/test_modeparsers.py25
-rw-r--r--tests/unit/mainwindow/statusbar/test_textbase.py10
-rw-r--r--tests/unit/mainwindow/statusbar/test_url.py30
-rw-r--r--tests/unit/mainwindow/test_messageview.py18
-rw-r--r--tests/unit/mainwindow/test_prompt.py10
-rw-r--r--tests/unit/mainwindow/test_tabwidget.py6
-rw-r--r--tests/unit/misc/test_autoupdate.py4
-rw-r--r--tests/unit/misc/test_editor.py24
-rw-r--r--tests/unit/misc/test_guiprocess.py15
-rw-r--r--tests/unit/misc/test_ipc.py85
-rw-r--r--tests/unit/misc/test_miscwidgets.py33
-rw-r--r--tests/unit/misc/test_msgbox.py21
-rw-r--r--tests/unit/misc/test_pastebin.py8
-rw-r--r--tests/unit/misc/test_sessions.py16
-rw-r--r--tests/unit/misc/test_sql.py12
-rw-r--r--tests/unit/misc/test_throttle.py5
-rw-r--r--tests/unit/misc/test_utilcmds.py4
-rw-r--r--tests/unit/test_app.py4
-rw-r--r--tests/unit/utils/test_debug.py65
-rw-r--r--tests/unit/utils/test_error.py9
-rw-r--r--tests/unit/utils/test_jinja.py6
-rw-r--r--tests/unit/utils/test_log.py4
-rw-r--r--tests/unit/utils/test_qtutils.py185
-rw-r--r--tests/unit/utils/test_standarddir.py10
-rw-r--r--tests/unit/utils/test_urlmatch.py42
-rw-r--r--tests/unit/utils/test_urlutils.py157
-rw-r--r--tests/unit/utils/test_utils.py23
-rw-r--r--tests/unit/utils/test_version.py11
-rw-r--r--tests/unit/utils/usertypes/test_timer.py4
229 files changed, 3810 insertions, 4101 deletions
diff --git a/qutebrowser/api/config.py b/qutebrowser/api/config.py
index fd0890602..1b5045bed 100644
--- a/qutebrowser/api/config.py
+++ b/qutebrowser/api/config.py
@@ -21,7 +21,7 @@
from typing import cast, Any
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import core
from qutebrowser.config import config
@@ -38,6 +38,6 @@ from qutebrowser.config import config
val = cast('config.ConfigContainer', None)
-def get(name: str, url: QUrl = None) -> Any:
+def get(name: str, url: core.QUrl = None) -> Any:
"""Get a value from the config based on a string name."""
return config.instance.get(name, url)
diff --git a/qutebrowser/api/downloads.py b/qutebrowser/api/downloads.py
index 85f5b8b91..a27319833 100644
--- a/qutebrowser/api/downloads.py
+++ b/qutebrowser/api/downloads.py
@@ -23,20 +23,19 @@
import io
-from qutebrowser.qt.core import QObject, pyqtSignal, pyqtSlot, QUrl
-
from qutebrowser.browser import downloads, qtnetworkdownloads
from qutebrowser.utils import objreg
+from qutebrowser.qt import core
UnsupportedAttribute = downloads.UnsupportedAttribute
-class TempDownload(QObject):
+class TempDownload(core.QObject):
"""A download of some data into a file object."""
- finished = pyqtSignal()
+ finished = core.pyqtSignal()
def __init__(self, item: qtnetworkdownloads.DownloadItem) -> None:
super().__init__()
@@ -45,13 +44,13 @@ class TempDownload(QObject):
self.successful = False
self.fileobj = item.fileobj
- @pyqtSlot()
+ @core.pyqtSlot()
def _on_download_finished(self) -> None:
self.successful = self._item.successful
self.finished.emit()
-def download_temp(url: QUrl) -> TempDownload:
+def download_temp(url: core.QUrl) -> TempDownload:
"""Download the given URL into a file object.
The download is not saved to disk.
diff --git a/qutebrowser/app.py b/qutebrowser/app.py
index 6b5c35914..d5a65ba87 100644
--- a/qutebrowser/app.py
+++ b/qutebrowser/app.py
@@ -46,10 +46,7 @@ import datetime
import argparse
from typing import Iterable, Optional
-from qutebrowser.qt import machinery
-from qutebrowser.qt.widgets import QApplication, QWidget
-from qutebrowser.qt.gui import QDesktopServices, QPixmap, QIcon
-from qutebrowser.qt.core import pyqtSlot, QUrl, QObject, QEvent, pyqtSignal, Qt
+from qutebrowser.qt import widgets, gui, core, machinery
import qutebrowser
from qutebrowser.commands import runners
@@ -147,7 +144,7 @@ def init(*, args: argparse.Namespace) -> None:
crashsignal.crash_handler.init_faulthandler()
objects.qapp.setQuitOnLastWindowClosed(False)
- quitter.instance.shutting_down.connect(QApplication.closeAllWindows)
+ quitter.instance.shutting_down.connect(widgets.QApplication.closeAllWindows)
_init_icon()
@@ -170,7 +167,7 @@ def init(*, args: argparse.Namespace) -> None:
_process_args(args)
for scheme in ['http', 'https', 'qute']:
- QDesktopServices.setUrlHandler(
+ gui.QDesktopServices.setUrlHandler(
scheme, open_desktopservices_url)
log.init.debug("Init done!")
@@ -179,16 +176,16 @@ def init(*, args: argparse.Namespace) -> None:
def _init_icon():
"""Initialize the icon of qutebrowser."""
- fallback_icon = QIcon()
+ fallback_icon = gui.QIcon()
for size in [16, 24, 32, 48, 64, 96, 128, 256, 512]:
filename = 'icons/qutebrowser-{size}x{size}.png'.format(size=size)
- pixmap = QPixmap()
+ pixmap = gui.QPixmap()
pixmap.loadFromData(resources.read_file_binary(filename))
if pixmap.isNull():
log.init.warning("Failed to load {}".format(filename))
else:
fallback_icon.addPixmap(pixmap)
- icon = QIcon.fromTheme('qutebrowser', fallback_icon)
+ icon = gui.QIcon.fromTheme('qutebrowser', fallback_icon)
if icon.isNull():
log.init.warning("Failed to load icon")
else:
@@ -374,7 +371,7 @@ def _open_special_pages(args):
for state, condition, url in pages:
if general_sect.get(state) != '1' and condition:
- tabbed_browser.tabopen(QUrl(url), background=False)
+ tabbed_browser.tabopen(core.QUrl(url), background=False)
general_sect[state] = '1'
# Show changelog on new releases
@@ -401,7 +398,7 @@ def _open_special_pages(args):
message.info(f"Showing changelog after upgrade to qutebrowser v{qbversion}.")
changelog_url = f'qute://help/changelog.html#v{qbversion}'
- tabbed_browser.tabopen(QUrl(changelog_url), background=False)
+ tabbed_browser.tabopen(core.QUrl(changelog_url), background=False)
def on_focus_changed(_old, new):
@@ -409,7 +406,7 @@ def on_focus_changed(_old, new):
if new is None:
return
- if not isinstance(new, QWidget):
+ if not isinstance(new, widgets.QWidget):
log.misc.debug("on_focus_changed called with non-QWidget {!r}".format(
new))
return
@@ -520,7 +517,7 @@ def _init_modules(*, args):
windowundo.init()
-class Application(QApplication):
+class Application(widgets.QApplication):
"""Main application instance.
@@ -533,8 +530,8 @@ class Application(QApplication):
window_closing: A window is being closed.
"""
- new_window = pyqtSignal(mainwindow.MainWindow)
- window_closing = pyqtSignal(mainwindow.MainWindow)
+ new_window = core.pyqtSignal(mainwindow.MainWindow)
+ window_closing = core.pyqtSignal(mainwindow.MainWindow)
def __init__(self, args):
"""Constructor.
@@ -558,19 +555,19 @@ class Application(QApplication):
self.focusObjectChanged.connect(self.on_focus_object_changed)
try:
- self.setAttribute(Qt.ApplicationAttribute.AA_UseHighDpiPixmaps, True)
+ self.setAttribute(core.Qt.ApplicationAttribute.AA_UseHighDpiPixmaps, True)
except AttributeError:
# default and removed in Qt 6
pass
self.new_window.connect(self._on_new_window)
- @pyqtSlot(mainwindow.MainWindow)
+ @core.pyqtSlot(mainwindow.MainWindow)
def _on_new_window(self, window):
window.tabbed_browser.shutting_down.connect(functools.partial(
self.window_closing.emit, window))
- @pyqtSlot(QObject)
+ @core.pyqtSlot(core.QObject)
def on_focus_object_changed(self, obj):
"""Log when the focus object changed."""
output = repr(obj)
@@ -580,7 +577,7 @@ class Application(QApplication):
def event(self, e):
"""Handle macOS FileOpen events."""
- if e.type() != QEvent.Type.FileOpen:
+ if e.type() != core.QEvent.Type.FileOpen:
return super().event(e)
url = e.url()
diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py
index 811a530a7..0b5e79573 100644
--- a/qutebrowser/browser/browsertab.py
+++ b/qutebrowser/browser/browsertab.py
@@ -25,13 +25,7 @@ import functools
import dataclasses
from typing import (cast, TYPE_CHECKING, Any, Callable, Iterable, List, Optional,
Sequence, Set, Type, Union, Tuple)
-
-from qutebrowser.qt.core import (pyqtSignal, pyqtSlot, QUrl, QObject, QSizeF, Qt,
- QEvent, QPoint, QRect)
-from qutebrowser.qt.gui import QKeyEvent, QIcon, QPixmap
-from qutebrowser.qt.widgets import QApplication, QWidget
-from qutebrowser.qt.printsupport import QPrintDialog, QPrinter
-from qutebrowser.qt.network import QNetworkAccessManager
+from qutebrowser.qt import widgets, printsupport, network
if TYPE_CHECKING:
from qutebrowser.qt.webkit import QWebHistory, QWebHistoryItem
@@ -45,7 +39,7 @@ from qutebrowser.utils import (utils, objreg, usertypes, log, qtutils,
urlutils, message, jinja)
from qutebrowser.misc import miscwidgets, objects, sessions
from qutebrowser.browser import eventfilter, inspector
-from qutebrowser.qt import sip
+from qutebrowser.qt import gui, core, sip
if TYPE_CHECKING:
from qutebrowser.browser import webelem
@@ -58,7 +52,7 @@ _WidgetType = Union["QWebView", "QWebEngineView"]
def create(win_id: int,
private: bool,
- parent: QWidget = None) -> 'AbstractTab':
+ parent: widgets.QWidget = None) -> 'AbstractTab':
"""Get a QtWebKit/QtWebEngine tab object.
Args:
@@ -225,22 +219,22 @@ class AbstractAction:
self._tab.dump_async(show_source_cb)
-class AbstractPrinting(QObject):
+class AbstractPrinting(core.QObject):
"""Attribute ``printing`` of AbstractTab for printing the page."""
- printing_finished = pyqtSignal(bool)
- pdf_printing_finished = pyqtSignal(str, bool) # filename, ok
+ printing_finished = core.pyqtSignal(bool)
+ pdf_printing_finished = core.pyqtSignal(str, bool) # filename, ok
- def __init__(self, tab: 'AbstractTab', parent: QWidget = None) -> None:
+ def __init__(self, tab: 'AbstractTab', parent: widgets.QWidget = None) -> None:
super().__init__(parent)
self._widget = cast(_WidgetType, None)
self._tab = tab
- self._dialog: QPrintDialog = None
+ self._dialog: printsupport.QPrintDialog = None
self.printing_finished.connect(self._on_printing_finished)
self.pdf_printing_finished.connect(self._on_pdf_printing_finished)
- @pyqtSlot(bool)
+ @core.pyqtSlot(bool)
def _on_printing_finished(self, ok):
# Only reporting error here, as the user has feedback from the dialog
# (and probably their printer) already.
@@ -250,7 +244,7 @@ class AbstractPrinting(QObject):
self._dialog.deleteLater()
self._dialog = None
- @pyqtSlot(str, bool)
+ @core.pyqtSlot(str, bool)
def _on_pdf_printing_finished(self, path, ok):
if ok:
message.info(f"Printed to {path}")
@@ -277,7 +271,7 @@ class AbstractPrinting(QObject):
"""Print the tab to a PDF with the given filename."""
raise NotImplementedError
- def to_printer(self, printer: QPrinter):
+ def to_printer(self, printer: printsupport.QPrinter):
"""Print the tab.
Args:
@@ -287,7 +281,7 @@ class AbstractPrinting(QObject):
def show_dialog(self) -> None:
"""Print with a QPrintDialog."""
- self._dialog = QPrintDialog(self._tab)
+ self._dialog = printsupport.QPrintDialog(self._tab)
self._dialog.open(lambda: self.to_printer(self._dialog.printer()))
# Gets cleaned up in on_printing_finished
@@ -347,7 +341,7 @@ class SearchNavigationResult(enum.Enum):
wrap_prevented_top = enum.auto()
-class AbstractSearch(QObject):
+class AbstractSearch(core.QObject):
"""Attribute ``search`` of AbstractTab for doing searches.
@@ -367,14 +361,14 @@ class AbstractSearch(QObject):
cleared: An existing search was cleared.
"""
- finished = pyqtSignal(bool)
- match_changed = pyqtSignal(SearchMatch)
- cleared = pyqtSignal()
+ finished = core.pyqtSignal(bool)
+ match_changed = core.pyqtSignal(SearchMatch)
+ cleared = core.pyqtSignal()
_Callback = Callable[[bool], None]
_NavCallback = Callable[[SearchNavigationResult], None]
- def __init__(self, tab: 'AbstractTab', parent: QWidget = None):
+ def __init__(self, tab: 'AbstractTab', parent: widgets.QWidget = None):
super().__init__(parent)
self._tab = tab
self._widget = cast(_WidgetType, None)
@@ -435,11 +429,11 @@ class AbstractSearch(QObject):
raise NotImplementedError
-class AbstractZoom(QObject):
+class AbstractZoom(core.QObject):
"""Attribute ``zoom`` of AbstractTab for controlling zoom."""
- def __init__(self, tab: 'AbstractTab', parent: QWidget = None) -> None:
+ def __init__(self, tab: 'AbstractTab', parent: widgets.QWidget = None) -> None:
super().__init__(parent)
self._tab = tab
self._widget = cast(_WidgetType, None)
@@ -449,7 +443,7 @@ class AbstractZoom(QObject):
config.instance.changed.connect(self._on_config_changed)
self._zoom_factor = float(config.val.zoom.default) / 100
- @pyqtSlot(str)
+ @core.pyqtSlot(str)
def _on_config_changed(self, option: str) -> None:
if option in ['zoom.levels', 'zoom.default']:
if not self._default_zoom_changed:
@@ -522,19 +516,19 @@ class SelectionState(enum.Enum):
line = enum.auto()
-class AbstractCaret(QObject):
+class AbstractCaret(core.QObject):
"""Attribute ``caret`` of AbstractTab for caret browsing."""
#: Signal emitted when the selection was toggled.
- selection_toggled = pyqtSignal(SelectionState)
+ selection_toggled = core.pyqtSignal(SelectionState)
#: Emitted when a ``follow_selection`` action is done.
- follow_selected_done = pyqtSignal()
+ follow_selected_done = core.pyqtSignal()
def __init__(self,
tab: 'AbstractTab',
mode_manager: modeman.ModeManager,
- parent: QWidget = None) -> None:
+ parent: widgets.QWidget = None) -> None:
super().__init__(parent)
self._widget = cast(_WidgetType, None)
self._mode_manager = mode_manager
@@ -608,32 +602,32 @@ class AbstractCaret(QObject):
def _follow_enter(self, tab: bool) -> None:
"""Follow a link by faking an enter press."""
if tab:
- self._tab.fake_key_press(Qt.Key.Key_Enter, modifier=Qt.KeyboardModifier.ControlModifier)
+ self._tab.fake_key_press(core.Qt.Key.Key_Enter, modifier=core.Qt.KeyboardModifier.ControlModifier)
else:
- self._tab.fake_key_press(Qt.Key.Key_Enter)
+ self._tab.fake_key_press(core.Qt.Key.Key_Enter)
def follow_selected(self, *, tab: bool = False) -> None:
raise NotImplementedError
-class AbstractScroller(QObject):
+class AbstractScroller(core.QObject):
"""Attribute ``scroller`` of AbstractTab to manage scroll position."""
#: Signal emitted when the scroll position changed (int, int)
- perc_changed = pyqtSignal(int, int)
+ perc_changed = core.pyqtSignal(int, int)
#: Signal emitted before the user requested a jump.
#: Used to set the special ' mark so the user can return.
- before_jump_requested = pyqtSignal()
+ before_jump_requested = core.pyqtSignal()
- def __init__(self, tab: 'AbstractTab', parent: QWidget = None):
+ def __init__(self, tab: 'AbstractTab', parent: widgets.QWidget = None):
super().__init__(parent)
self._tab = tab
self._widget = cast(_WidgetType, None)
if 'log-scroll-pos' in objects.debug_flags:
self.perc_changed.connect(self._log_scroll_pos_change)
- @pyqtSlot()
+ @core.pyqtSlot()
def _log_scroll_pos_change(self) -> None:
log.webview.vdebug( # type: ignore[attr-defined]
"Scroll position changed to {}".format(self.pos_px()))
@@ -641,7 +635,7 @@ class AbstractScroller(QObject):
def _init_widget(self, widget: _WidgetType) -> None:
self._widget = widget
- def pos_px(self) -> QPoint:
+ def pos_px(self) -> core.QPoint:
raise NotImplementedError
def pos_perc(self) -> Tuple[int, int]:
@@ -650,7 +644,7 @@ class AbstractScroller(QObject):
def to_perc(self, x: float = None, y: float = None) -> None:
raise NotImplementedError
- def to_point(self, point: QPoint) -> None:
+ def to_point(self, point: core.QPoint) -> None:
raise NotImplementedError
def to_anchor(self, name: str) -> None:
@@ -825,7 +819,7 @@ class AbstractElements:
"""
raise NotImplementedError
- def find_at_pos(self, pos: QPoint, callback: _SingleCallback) -> None:
+ def find_at_pos(self, pos: core.QPoint, callback: _SingleCallback) -> None:
"""Find the element at the given position async.
This is also called "hit test" elsewhere.
@@ -838,14 +832,14 @@ class AbstractElements:
raise NotImplementedError
-class AbstractAudio(QObject):
+class AbstractAudio(core.QObject):
"""Handling of audio/muting for this tab."""
- muted_changed = pyqtSignal(bool)
- recently_audible_changed = pyqtSignal(bool)
+ muted_changed = core.pyqtSignal(bool)
+ recently_audible_changed = core.pyqtSignal(bool)
- def __init__(self, tab: 'AbstractTab', parent: QWidget = None) -> None:
+ def __init__(self, tab: 'AbstractTab', parent: widgets.QWidget = None) -> None:
super().__init__(parent)
self._widget = cast(_WidgetType, None)
self._tab = tab
@@ -883,7 +877,7 @@ class AbstractTabPrivate:
self._tab = tab
self._mode_manager = mode_manager
- def event_target(self) -> Optional[QWidget]:
+ def event_target(self) -> Optional[widgets.QWidget]:
"""Return the widget events should be sent to."""
raise NotImplementedError
@@ -912,7 +906,7 @@ class AbstractTabPrivate:
def clear_ssl_errors(self) -> None:
raise NotImplementedError
- def networkaccessmanager(self) -> Optional[QNetworkAccessManager]:
+ def networkaccessmanager(self) -> Optional[network.QNetworkAccessManager]:
"""Get the QNetworkAccessManager for this tab.
This is only implemented for QtWebKit.
@@ -957,7 +951,7 @@ class AbstractTabPrivate:
def _init_inspector(self, splitter: 'miscwidgets.InspectorSplitter',
win_id: int,
- parent: QWidget = None) -> 'AbstractWebInspector':
+ parent: widgets.QWidget = None) -> 'AbstractWebInspector':
"""Get a WebKitInspector/WebEngineInspector.
Args:
@@ -968,49 +962,49 @@ class AbstractTabPrivate:
raise NotImplementedError
-class AbstractTab(QWidget):
+class AbstractTab(widgets.QWidget):
"""An adapter for QWebView/QWebEngineView representing a single tab."""
#: Signal emitted when a website requests to close this tab.
- window_close_requested = pyqtSignal()
+ window_close_requested = core.pyqtSignal()
#: Signal emitted when a link is hovered (the hover text)
- link_hovered = pyqtSignal(str)
+ link_hovered = core.pyqtSignal(str)
#: Signal emitted when a page started loading
- load_started = pyqtSignal()
+ load_started = core.pyqtSignal()
#: Signal emitted when a page is loading (progress percentage)
- load_progress = pyqtSignal(int)
+ load_progress = core.pyqtSignal(int)
#: Signal emitted when a page finished loading (success as bool)
- load_finished = pyqtSignal(bool)
+ load_finished = core.pyqtSignal(bool)
#: Signal emitted when a page's favicon changed (icon as QIcon)
- icon_changed = pyqtSignal(QIcon)
+ icon_changed = core.pyqtSignal(gui.QIcon)
#: Signal emitted when a page's title changed (new title as str)
- title_changed = pyqtSignal(str)
+ title_changed = core.pyqtSignal(str)
#: Signal emitted when this tab was pinned/unpinned (new pinned state as bool)
- pinned_changed = pyqtSignal(bool)
+ pinned_changed = core.pyqtSignal(bool)
#: Signal emitted when a new tab should be opened (url as QUrl)
- new_tab_requested = pyqtSignal(QUrl)
+ new_tab_requested = core.pyqtSignal(core.QUrl)
#: Signal emitted when a page's URL changed (url as QUrl)
- url_changed = pyqtSignal(QUrl)
+ url_changed = core.pyqtSignal(core.QUrl)
#: Signal emitted when a tab's content size changed
#: (new size as QSizeF)
- contents_size_changed = pyqtSignal(QSizeF)
+ contents_size_changed = core.pyqtSignal(core.QSizeF)
#: Signal emitted when a page requested full-screen (bool)
- fullscreen_requested = pyqtSignal(bool)
+ fullscreen_requested = core.pyqtSignal(bool)
#: Signal emitted before load starts (URL as QUrl)
- before_load_started = pyqtSignal(QUrl)
+ before_load_started = core.pyqtSignal(core.QUrl)
# Signal emitted when a page's load status changed
# (argument: usertypes.LoadStatus)
- load_status_changed = pyqtSignal(usertypes.LoadStatus)
+ load_status_changed = core.pyqtSignal(usertypes.LoadStatus)
# Signal emitted before shutting down
- shutting_down = pyqtSignal()
+ shutting_down = core.pyqtSignal()
# Signal emitted when a history item should be added
- history_item_triggered = pyqtSignal(QUrl, QUrl, str)
+ history_item_triggered = core.pyqtSignal(core.QUrl, core.QUrl, str)
# Signal emitted when the underlying renderer process terminated.
# arg 0: A TerminationStatus member.
# arg 1: The exit code.
- renderer_process_terminated = pyqtSignal(TerminationStatus, int)
+ renderer_process_terminated = core.pyqtSignal(TerminationStatus, int)
# Hosts for which a certificate error happened. Shared between all tabs.
#
@@ -1035,7 +1029,7 @@ class AbstractTab(QWidget):
def __init__(self, *, win_id: int,
mode_manager: 'modeman.ModeManager',
private: bool,
- parent: QWidget = None) -> None:
+ parent: widgets.QWidget = None) -> None:
utils.unused(mode_manager) # needed for mypy
self.is_private = private
self.win_id = win_id
@@ -1097,7 +1091,7 @@ class AbstractTab(QWidget):
self._load_status = val
self.load_status_changed.emit(val)
- def send_event(self, evt: QEvent) -> None:
+ def send_event(self, evt: core.QEvent) -> None:
"""Send the given event to the underlying widget.
The event will be sent via QApplication.postEvent.
@@ -1116,35 +1110,35 @@ class AbstractTab(QWidget):
return
evt.posted = True # type: ignore[attr-defined]
- QApplication.postEvent(recipient, evt)
+ widgets.QApplication.postEvent(recipient, evt)
def navigation_blocked(self) -> bool:
"""Test if navigation is allowed on the current tab."""
return self.data.pinned and config.val.tabs.pinned.frozen
- @pyqtSlot(QUrl)
- def _on_before_load_started(self, url: QUrl) -> None:
+ @core.pyqtSlot(core.QUrl)
+ def _on_before_load_started(self, url: core.QUrl) -> None:
"""Adjust the title if we are going to visit a URL soon."""
qtutils.ensure_valid(url)
url_string = url.toDisplayString()
log.webview.debug("Going to start loading: {}".format(url_string))
self.title_changed.emit(url_string)
- @pyqtSlot(QUrl)
- def _on_url_changed(self, url: QUrl) -> None:
+ @core.pyqtSlot(core.QUrl)
+ def _on_url_changed(self, url: core.QUrl) -> None:
"""Update title when URL has changed and no title is available."""
if url.isValid() and not self.title():
self.title_changed.emit(url.toDisplayString())
self.url_changed.emit(url)
- @pyqtSlot()
+ @core.pyqtSlot()
def _on_load_started(self) -> None:
self._progress = 0
self.data.viewing_source = False
self._set_load_status(usertypes.LoadStatus.loading)
self.load_started.emit()
- @pyqtSlot(usertypes.NavigationRequest)
+ @core.pyqtSlot(usertypes.NavigationRequest)
def _on_navigation_request(
self,
navigation: usertypes.NavigationRequest
@@ -1172,7 +1166,7 @@ class AbstractTab(QWidget):
navigation.url.errorString()))
navigation.accepted = False
- @pyqtSlot(bool)
+ @core.pyqtSlot(bool)
def _on_load_finished(self, ok: bool) -> None:
assert self._widget is not None
if sip.isdeleted(self._widget):
@@ -1209,17 +1203,17 @@ class AbstractTab(QWidget):
self._set_load_status(loadstatus)
- @pyqtSlot()
+ @core.pyqtSlot()
def _on_history_trigger(self) -> None:
"""Emit history_item_triggered based on backend-specific signal."""
raise NotImplementedError
- @pyqtSlot(int)
+ @core.pyqtSlot(int)
def _on_load_progress(self, perc: int) -> None:
self._progress = perc
self.load_progress.emit(perc)
- def url(self, *, requested: bool = False) -> QUrl:
+ def url(self, *, requested: bool = False) -> core.QUrl:
raise NotImplementedError
def progress(self) -> int:
@@ -1228,11 +1222,11 @@ class AbstractTab(QWidget):
def load_status(self) -> usertypes.LoadStatus:
return self._load_status
- def _load_url_prepare(self, url: QUrl) -> None:
+ def _load_url_prepare(self, url: core.QUrl) -> None:
qtutils.ensure_valid(url)
self.before_load_started.emit(url)
- def load_url(self, url: QUrl) -> None:
+ def load_url(self, url: core.QUrl) -> None:
raise NotImplementedError
def reload(self, *, force: bool = False) -> None:
@@ -1242,11 +1236,11 @@ class AbstractTab(QWidget):
raise NotImplementedError
def fake_key_press(self,
- key: Qt.Key,
- modifier: Qt.KeyboardModifier = Qt.KeyboardModifier.NoModifier) -> None:
+ key: core.Qt.Key,
+ modifier: core.Qt.KeyboardModifier = core.Qt.KeyboardModifier.NoModifier) -> None:
"""Send a fake key event to this tab."""
- press_evt = QKeyEvent(QEvent.Type.KeyPress, key, modifier, 0, 0, 0)
- release_evt = QKeyEvent(QEvent.Type.KeyRelease, key, modifier,
+ press_evt = gui.QKeyEvent(core.QEvent.Type.KeyPress, key, modifier, 0, 0, 0)
+ release_evt = gui.QKeyEvent(core.QEvent.Type.KeyRelease, key, modifier,
0, 0, 0)
self.send_event(press_evt)
self.send_event(release_evt)
@@ -1283,10 +1277,10 @@ class AbstractTab(QWidget):
def title(self) -> str:
raise NotImplementedError
- def icon(self) -> QIcon:
+ def icon(self) -> gui.QIcon:
raise NotImplementedError
- def set_html(self, html: str, base_url: QUrl = QUrl()) -> None:
+ def set_html(self, html: str, base_url: core.QUrl = core.QUrl()) -> None:
raise NotImplementedError
def set_pinned(self, pinned: bool) -> None:
@@ -1301,7 +1295,7 @@ class AbstractTab(QWidget):
"""
raise NotImplementedError
- def grab_pixmap(self, rect: QRect = None) -> Optional[QPixmap]:
+ def grab_pixmap(self, rect: core.QRect = None) -> Optional[gui.QPixmap]:
"""Grab a QPixmap of the displayed page.
Returns None if we got a null pixmap from Qt.
@@ -1320,7 +1314,7 @@ class AbstractTab(QWidget):
def __repr__(self) -> str:
try:
qurl = self.url()
- url = qurl.toDisplayString(QUrl.ComponentFormattingOption.EncodeUnicode)
+ url = qurl.toDisplayString(core.QUrl.ComponentFormattingOption.EncodeUnicode)
except (AttributeError, RuntimeError) as exc:
url = '<{}>'.format(exc.__class__.__name__)
else:
diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py
index 97aa21a3e..7ddb77146 100644
--- a/qutebrowser/browser/commands.py
+++ b/qutebrowser/browser/commands.py
@@ -24,9 +24,6 @@ import shlex
import functools
from typing import cast, Callable, Dict, Union
-from qutebrowser.qt.widgets import QApplication, QTabBar
-from qutebrowser.qt.core import Qt, QUrl, QEvent, QUrlQuery
-
from qutebrowser.commands import userscripts, runners
from qutebrowser.api import cmdutils
from qutebrowser.config import config, configdata
@@ -39,6 +36,7 @@ from qutebrowser.utils.usertypes import KeyMode
from qutebrowser.misc import editor, guiprocess, objects
from qutebrowser.completion.models import urlmodel, miscmodels
from qutebrowser.mainwindow import mainwindow, windowundo
+from qutebrowser.qt import widgets, core
class CommandDispatcher:
@@ -197,16 +195,16 @@ class CommandDispatcher:
"""
cmdutils.check_exclusive((prev, next_, opposite), 'pno')
if prev:
- return QTabBar.SelectionBehavior.SelectLeftTab
+ return widgets.QTabBar.SelectionBehavior.SelectLeftTab
elif next_:
- return QTabBar.SelectionBehavior.SelectRightTab
+ return widgets.QTabBar.SelectionBehavior.SelectRightTab
elif opposite:
conf_selection = config.val.tabs.select_on_remove
- if conf_selection == QTabBar.SelectionBehavior.SelectLeftTab:
- return QTabBar.SelectionBehavior.SelectRightTab
- elif conf_selection == QTabBar.SelectionBehavior.SelectRightTab:
- return QTabBar.SelectionBehavior.SelectLeftTab
- elif conf_selection == QTabBar.SelectionBehavior.SelectPreviousTab:
+ if conf_selection == widgets.QTabBar.SelectionBehavior.SelectLeftTab:
+ return widgets.QTabBar.SelectionBehavior.SelectRightTab
+ elif conf_selection == widgets.QTabBar.SelectionBehavior.SelectRightTab:
+ return widgets.QTabBar.SelectionBehavior.SelectLeftTab
+ elif conf_selection == widgets.QTabBar.SelectionBehavior.SelectPreviousTab:
raise cmdutils.CommandError(
"-o is not supported with 'tabs.select_on_remove' set to "
"'last-used'!")
@@ -366,7 +364,7 @@ class CommandDispatcher:
Return:
A list of URLs that can be opened.
"""
- if isinstance(url, QUrl):
+ if isinstance(url, core.QUrl):
yield url
return
@@ -604,7 +602,7 @@ class CommandDispatcher:
widget = self._current_widget()
url = self._current_url()
- handlers: Dict[str, Callable[..., QUrl]] = {
+ handlers: Dict[str, Callable[..., core.QUrl]] = {
'prev': functools.partial(navigate.prevnext, prev=True),
'next': functools.partial(navigate.prevnext, prev=False),
'up': navigate.path_up,
@@ -671,12 +669,12 @@ class CommandDispatcher:
assert what in ['url', 'pretty-url'], what
if what == 'pretty-url':
- flags = QUrl.UrlFormattingOption.RemovePassword | QUrl.ComponentFormattingOption.DecodeReserved
+ flags = core.QUrl.UrlFormattingOption.RemovePassword | core.QUrl.ComponentFormattingOption.DecodeReserved
else:
- flags = QUrl.UrlFormattingOption.RemovePassword | QUrl.ComponentFormattingOption.FullyEncoded
+ flags = core.QUrl.UrlFormattingOption.RemovePassword | core.QUrl.ComponentFormattingOption.FullyEncoded
- url = QUrl(self._current_url())
- url_query = QUrlQuery()
+ url = core.QUrl(self._current_url())
+ url_query = core.QUrlQuery()
url_query_str = url.query()
if '&' not in url_query_str and ';' in url_query_str:
url_query.setQueryDelimiters('=', ';')
@@ -908,7 +906,7 @@ class CommandDispatcher:
idx = int(index_parts[1])
elif len(index_parts) == 1:
idx = int(index_parts[0])
- active_win = QApplication.activeWindow()
+ active_win = widgets.QApplication.activeWindow()
if active_win is None:
# Not sure how you enter a command without an active window...
raise cmdutils.CommandError(
@@ -1100,7 +1098,7 @@ class CommandDispatcher:
if output:
tb = objreg.get('tabbed-browser', scope='window',
window='last-focused')
- tb.load_url(QUrl(f'qute://process/{proc.pid}'), newtab=True)
+ tb.load_url(core.QUrl(f'qute://process/{proc.pid}'), newtab=True)
if userscript:
def _selection_callback(s):
@@ -1164,7 +1162,7 @@ class CommandDispatcher:
except qtutils.QtValueError:
pass
else:
- env['QUTE_URL'] = url.toString(QUrl.ComponentFormattingOption.FullyEncoded)
+ env['QUTE_URL'] = url.toString(core.QUrl.ComponentFormattingOption.FullyEncoded)
try:
runner = userscripts.run_async(
@@ -1295,8 +1293,8 @@ class CommandDispatcher:
current page's url.
"""
if url is None:
- url = self._current_url().toString(QUrl.UrlFormattingOption.RemovePassword |
- QUrl.ComponentFormattingOption.FullyEncoded)
+ url = self._current_url().toString(core.QUrl.UrlFormattingOption.RemovePassword |
+ core.QUrl.ComponentFormattingOption.FullyEncoded)
try:
objreg.get('bookmark-manager').delete(url)
except KeyError:
@@ -1313,7 +1311,7 @@ class CommandDispatcher:
window: Open in a new window.
jump: Jump to the "bookmarks" header.
"""
- url = QUrl('qute://bookmarks/')
+ url = core.QUrl('qute://bookmarks/')
if jump:
url.setFragment('bookmarks')
self._open(url, tab, bg, window)
@@ -1342,7 +1340,7 @@ class CommandDispatcher:
if mhtml_:
raise cmdutils.CommandError("Can only download the current "
"page as mhtml.")
- url = QUrl.fromUserInput(url)
+ url = core.QUrl.fromUserInput(url)
urlutils.raise_cmdexc_if_invalid(url)
download_manager.get(url, target=target)
elif mhtml_:
@@ -1407,7 +1405,7 @@ class CommandDispatcher:
bg: Open in a background tab.
window: Open in a new window.
"""
- url = QUrl('qute://history/')
+ url = core.QUrl('qute://history/')
self._open(url, tab, bg, window)
@cmdutils.register(instance='command-dispatcher', name='help',
@@ -1443,7 +1441,7 @@ class CommandDispatcher:
path = 'settings.html#{}'.format(topic)
else:
raise cmdutils.CommandError("Invalid help topic {}!".format(topic))
- url = QUrl('qute://help/{}'.format(path))
+ url = core.QUrl('qute://help/{}'.format(path))
self._open(url, tab, bg, window)
@cmdutils.register(instance='command-dispatcher', scope='window')
@@ -1466,7 +1464,7 @@ class CommandDispatcher:
if level.upper() not in log.LOG_LEVELS:
raise cmdutils.CommandError("Invalid log level {}!".format(level))
- query = QUrlQuery()
+ query = core.QUrlQuery()
query.addQueryItem('level', level)
if plain:
query.addQueryItem('plain', cast(str, None))
@@ -1478,7 +1476,7 @@ class CommandDispatcher:
raise cmdutils.CommandError(e)
query.addQueryItem('logfilter', logfilter)
- url = QUrl('qute://log')
+ url = core.QUrl('qute://log')
url.setQuery(query)
self._open(url, tab, bg, window)
@@ -1711,7 +1709,7 @@ class CommandDispatcher:
raise cmdutils.CommandError(str(e))
elif url:
try:
- js_code = urlutils.parse_javascript_url(QUrl(js_code))
+ js_code = urlutils.parse_javascript_url(core.QUrl(js_code))
except urlutils.Error as e:
raise cmdutils.CommandError(str(e))
@@ -1739,15 +1737,15 @@ class CommandDispatcher:
raise cmdutils.CommandError(str(e))
for keyinfo in sequence:
- press_event = keyinfo.to_event(QEvent.Type.KeyPress)
- release_event = keyinfo.to_event(QEvent.Type.KeyRelease)
+ press_event = keyinfo.to_event(core.QEvent.Type.KeyPress)
+ release_event = keyinfo.to_event(core.QEvent.Type.KeyRelease)
if global_:
- window = QApplication.focusWindow()
+ window = widgets.QApplication.focusWindow()
if window is None:
raise cmdutils.CommandError("No focused window!")
- QApplication.postEvent(window, press_event)
- QApplication.postEvent(window, release_event)
+ widgets.QApplication.postEvent(window, press_event)
+ widgets.QApplication.postEvent(window, release_event)
else:
tab = self._current_widget()
tab.send_event(press_event)
@@ -1847,9 +1845,9 @@ class CommandDispatcher:
if not window.isFullScreen():
window.state_before_fullscreen = window.windowState()
if enter:
- window.setWindowState(window.windowState() | Qt.WindowState.WindowFullScreen)
+ window.setWindowState(window.windowState() | core.Qt.WindowState.WindowFullScreen)
else:
- window.setWindowState(window.windowState() ^ Qt.WindowState.WindowFullScreen)
+ window.setWindowState(window.windowState() ^ core.Qt.WindowState.WindowFullScreen)
log.misc.debug('state before fullscreen: {}'.format(
- debug.qflags_key(Qt, window.state_before_fullscreen)))
+ debug.qflags_key(core.Qt, window.state_before_fullscreen)))
diff --git a/qutebrowser/browser/downloads.py b/qutebrowser/browser/downloads.py
index 8ce0ca1b2..c518c3b57 100644
--- a/qutebrowser/browser/downloads.py
+++ b/qutebrowser/browser/downloads.py
@@ -30,22 +30,19 @@ import tempfile
import enum
from typing import Any, Dict, IO, List, MutableSequence, Optional, Union
-from qutebrowser.qt.core import (pyqtSlot, pyqtSignal, Qt, QObject, QModelIndex,
- QTimer, QAbstractListModel, QUrl)
-
from qutebrowser.browser import pdfjs
from qutebrowser.api import cmdutils
from qutebrowser.config import config
from qutebrowser.utils import (usertypes, standarddir, utils, message, log,
qtutils, objreg)
-from qutebrowser.qt import sip
+from qutebrowser.qt import core, sip
class ModelRole(enum.IntEnum):
"""Custom download model roles."""
- item = Qt.ItemDataRole.UserRole
+ item = core.Qt.ItemDataRole.UserRole
# Remember the last used directory
@@ -78,7 +75,7 @@ def init():
config.instance.changed.connect(_clear_last_used)
-@pyqtSlot()
+@core.pyqtSlot()
def shutdown():
temp_download_manager.cleanup()
@@ -188,7 +185,7 @@ def get_filename_question(*, suggested_filename, url, parent=None):
q.title = "Save file to:"
q.text = "Please enter a location for <b>{}</b>".format(
html.escape(url.toDisplayString()))
- q.url = url.toString(QUrl.UrlFormattingOption.RemovePassword | QUrl.ComponentFormattingOption.FullyEncoded)
+ q.url = url.toString(core.QUrl.UrlFormattingOption.RemovePassword | core.QUrl.ComponentFormattingOption.FullyEncoded)
q.mode = usertypes.PromptMode.download
q.completed.connect(q.deleteLater)
q.default = _path_suggestion(suggested_filename)
@@ -329,7 +326,7 @@ class PDFJSDownloadTarget(_DownloadTarget):
return 'temporary PDF.js file'
-class DownloadItemStats(QObject):
+class DownloadItemStats(core.QObject):
"""Statistics (bytes done, total bytes, time, etc.) about a download.
@@ -398,7 +395,7 @@ class DownloadItemStats(QObject):
else:
return remaining_bytes / avg
- @pyqtSlot('qint64', 'qint64')
+ @core.pyqtSlot('qint64', 'qint64')
def on_download_progress(self, bytes_done, bytes_total):
"""Update local variables when the download progress changed.
@@ -412,7 +409,7 @@ class DownloadItemStats(QObject):
self.total = bytes_total
-class AbstractDownloadItem(QObject):
+class AbstractDownloadItem(core.QObject):
"""Shared QtNetwork/QtWebEngine part of a download item.
@@ -441,12 +438,12 @@ class AbstractDownloadItem(QObject):
arg 2: The original download URL.
"""
- data_changed = pyqtSignal()
- finished = pyqtSignal()
- error = pyqtSignal(str)
- cancelled = pyqtSignal()
- remove_requested = pyqtSignal()
- pdfjs_requested = pyqtSignal(str, QUrl)
+ data_changed = core.pyqtSignal()
+ finished = core.pyqtSignal()
+ error = core.pyqtSignal(str)
+ cancelled = core.pyqtSignal()
+ remove_requested = core.pyqtSignal()
+ pdfjs_requested = core.pyqtSignal(str, core.QUrl)
def __init__(self, manager, parent=None):
super().__init__(parent)
@@ -565,7 +562,7 @@ class AbstractDownloadItem(QObject):
"""Actual cancel implementation."""
raise NotImplementedError
- @pyqtSlot()
+ @core.pyqtSlot()
def cancel(self, *, remove_data=True):
"""Cancel the download.
@@ -581,7 +578,7 @@ class AbstractDownloadItem(QObject):
self.finished.emit()
self.data_changed.emit()
- @pyqtSlot()
+ @core.pyqtSlot()
def remove(self):
"""Remove the download from the model."""
self.remove_requested.emit()
@@ -597,12 +594,12 @@ class AbstractDownloadItem(QObject):
except OSError:
log.downloads.exception("Failed to remove partial file")
- @pyqtSlot()
+ @core.pyqtSlot()
def retry(self):
"""Retry a failed download."""
raise NotImplementedError
- @pyqtSlot()
+ @core.pyqtSlot()
def try_retry(self):
"""Try to retry a download and show an error if it's unsupported."""
try:
@@ -610,11 +607,11 @@ class AbstractDownloadItem(QObject):
except UnsupportedOperationError as e:
message.error(str(e))
- def url(self) -> QUrl:
+ def url(self) -> core.QUrl:
"""Get the download's URL (i.e. where the file is downloaded from)."""
raise NotImplementedError
- def origin(self) -> QUrl:
+ def origin(self) -> core.QUrl:
"""Get the download's origin URL (i.e. the page starting the download)."""
raise NotImplementedError
@@ -625,7 +622,7 @@ class AbstractDownloadItem(QObject):
"""
raise NotImplementedError
- @pyqtSlot()
+ @core.pyqtSlot()
def open_file(self, cmdline=None, open_dir=False):
"""Open the downloaded file.
@@ -647,7 +644,7 @@ class AbstractDownloadItem(QObject):
# is important on systems where process creation takes long, as
# otherwise the prompt might hang around and cause bugs
# (see issue #2296)
- QTimer.singleShot(0, lambda: utils.open_file(filename, cmdline))
+ core.QTimer.singleShot(0, lambda: utils.open_file(filename, cmdline))
def _ensure_can_set_filename(self, filename):
"""Make sure we can still set a filename."""
@@ -884,7 +881,7 @@ class AbstractDownloadItem(QObject):
raise ValueError("Unsupported download target: {}".format(target))
-class AbstractDownloadManager(QObject):
+class AbstractDownloadManager(core.QObject):
"""Backend-independent download manager code.
@@ -901,11 +898,11 @@ class AbstractDownloadManager(QObject):
The argument is the index of the changed download
"""
- begin_remove_row = pyqtSignal(int)
- end_remove_row = pyqtSignal()
- begin_insert_row = pyqtSignal(int)
- end_insert_row = pyqtSignal()
- data_changed = pyqtSignal(int)
+ begin_remove_row = core.pyqtSignal(int)
+ end_remove_row = core.pyqtSignal()
+ begin_insert_row = core.pyqtSignal(int)
+ end_insert_row = core.pyqtSignal()
+ data_changed = core.pyqtSignal(int)
def __init__(self, parent=None):
super().__init__(parent)
@@ -917,7 +914,7 @@ class AbstractDownloadManager(QObject):
def __repr__(self):
return utils.get_repr(self, downloads=len(self.downloads))
- @pyqtSlot()
+ @core.pyqtSlot()
def _update_gui(self):
"""Periodical GUI update of all items."""
assert self.downloads
@@ -925,8 +922,8 @@ class AbstractDownloadManager(QObject):
dl.stats.update_speed()
self.data_changed.emit(-1)
- @pyqtSlot(str, QUrl)
- def _on_pdfjs_requested(self, filename: str, original_url: QUrl) -> None:
+ @core.pyqtSlot(str, core.QUrl)
+ def _on_pdfjs_requested(self, filename: str, original_url: core.QUrl) -> None:
"""Open PDF.js when a download requests it."""
tabbed_browser = objreg.get('tabbed-browser', scope='window',
window='last-focused')
@@ -942,7 +939,7 @@ class AbstractDownloadManager(QObject):
delay = config.val.downloads.remove_finished
if delay > -1:
download.finished.connect(
- lambda: QTimer.singleShot(delay, download.remove))
+ lambda: core.QTimer.singleShot(delay, download.remove))
elif auto_remove:
download.finished.connect(download.remove)
@@ -961,7 +958,7 @@ class AbstractDownloadManager(QObject):
if not self._update_timer.isActive():
self._update_timer.start()
- @pyqtSlot(AbstractDownloadItem)
+ @core.pyqtSlot(AbstractDownloadItem)
def _on_data_changed(self, download):
"""Emit data_changed signal when download data changed."""
try:
@@ -971,12 +968,12 @@ class AbstractDownloadManager(QObject):
return
self.data_changed.emit(idx)
- @pyqtSlot(str)
+ @core.pyqtSlot(str)
def _on_error(self, msg):
"""Display error message on download errors."""
message.error("Download error: {}".format(msg))
- @pyqtSlot(AbstractDownloadItem)
+ @core.pyqtSlot(AbstractDownloadItem)
def _remove_item(self, download):
"""Remove a given download."""
if sip.isdeleted(self):
@@ -1009,7 +1006,7 @@ class AbstractDownloadManager(QObject):
download.cancelled.connect(question.abort)
download.error.connect(question.abort)
- @pyqtSlot()
+ @core.pyqtSlot()
def shutdown(self):
"""Cancel all downloads when shutting down."""
for download in self.downloads:
@@ -1017,7 +1014,7 @@ class AbstractDownloadManager(QObject):
download.cancel(remove_data=False)
-class DownloadModel(QAbstractListModel):
+class DownloadModel(core.QAbstractListModel):
"""A list model showing downloads."""
@@ -1066,25 +1063,25 @@ class DownloadModel(QAbstractListModel):
log.downloads.debug("_on_begin_insert_row with idx {}, "
"webengine {}".format(idx, webengine))
if idx == -1:
- self.beginInsertRows(QModelIndex(), 0, -1)
+ self.beginInsertRows(core.QModelIndex(), 0, -1)
return
assert idx >= 0, idx
if webengine:
idx += len(self._qtnetwork_manager.downloads)
- self.beginInsertRows(QModelIndex(), idx, idx)
+ self.beginInsertRows(core.QModelIndex(), idx, idx)
def _on_begin_remove_row(self, idx, webengine=False):
log.downloads.debug("_on_begin_remove_row with idx {}, "
"webengine {}".format(idx, webengine))
if idx == -1:
- self.beginRemoveRows(QModelIndex(), 0, -1)
+ self.beginRemoveRows(core.QModelIndex(), 0, -1)
return
assert idx >= 0, idx
if webengine:
idx += len(self._qtnetwork_manager.downloads)
- self.beginRemoveRows(QModelIndex(), idx, idx)
+ self.beginRemoveRows(core.QModelIndex(), idx, idx)
def _on_data_changed(self, idx, *, webengine):
"""Called when a downloader's data changed.
@@ -1266,10 +1263,10 @@ class DownloadModel(QAbstractListModel):
idx = self.index(self.rowCount() - 1)
return idx
- def headerData(self, section, orientation, role=Qt.ItemDataRole.DisplayRole):
+ def headerData(self, section, orientation, role=core.Qt.ItemDataRole.DisplayRole):
"""Simple constant header."""
- if (section == 0 and orientation == Qt.Orientation.Horizontal and
- role == Qt.ItemDataRole.DisplayRole):
+ if (section == 0 and orientation == core.Qt.Orientation.Horizontal and
+ role == core.Qt.ItemDataRole.DisplayRole):
return "Downloads"
else:
return ""
@@ -1283,15 +1280,15 @@ class DownloadModel(QAbstractListModel):
return None
item = self[index.row()]
- if role == Qt.ItemDataRole.DisplayRole:
+ if role == core.Qt.ItemDataRole.DisplayRole:
data: Any = str(item)
- elif role == Qt.ItemDataRole.ForegroundRole:
+ elif role == core.Qt.ItemDataRole.ForegroundRole:
data = item.get_status_color('fg')
- elif role == Qt.ItemDataRole.BackgroundRole:
+ elif role == core.Qt.ItemDataRole.BackgroundRole:
data = item.get_status_color('bg')
elif role == ModelRole.item:
data = item
- elif role == Qt.ItemDataRole.ToolTipRole:
+ elif role == core.Qt.ItemDataRole.ToolTipRole:
if item.error_msg is None:
data = None
else:
@@ -1306,10 +1303,10 @@ class DownloadModel(QAbstractListModel):
The default would be Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsSelectable.
"""
if not index.isValid():
- return Qt.ItemFlag.NoItemFlags
- return Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemNeverHasChildren
+ return core.Qt.ItemFlag.NoItemFlags
+ return core.Qt.ItemFlag.ItemIsEnabled | core.Qt.ItemFlag.ItemNeverHasChildren
- def rowCount(self, parent=QModelIndex()):
+ def rowCount(self, parent=core.QModelIndex()):
"""Get count of active downloads."""
if parent.isValid():
# We don't have children
diff --git a/qutebrowser/browser/downloadview.py b/qutebrowser/browser/downloadview.py
index da0763b76..2811368ac 100644
--- a/qutebrowser/browser/downloadview.py
+++ b/qutebrowser/browser/downloadview.py
@@ -22,12 +22,10 @@
import functools
from typing import Callable, MutableSequence, Tuple, Union
-from qutebrowser.qt.core import pyqtSlot, QSize, Qt
-from qutebrowser.qt.widgets import QListView, QSizePolicy, QMenu, QStyleFactory
-
from qutebrowser.browser import downloads
from qutebrowser.config import stylesheet
from qutebrowser.utils import qtutils, utils
+from qutebrowser.qt import widgets, core
_ActionListType = MutableSequence[
@@ -38,7 +36,7 @@ _ActionListType = MutableSequence[
]
-class DownloadView(QListView):
+class DownloadView(widgets.QListView):
"""QListView which shows currently running downloads as a bar.
@@ -60,13 +58,13 @@ class DownloadView(QListView):
def __init__(self, model, parent=None):
super().__init__(parent)
if not utils.is_mac:
- self.setStyle(QStyleFactory.create('Fusion'))
+ self.setStyle(widgets.QStyleFactory.create('Fusion'))
stylesheet.set_register(self)
- self.setResizeMode(QListView.ResizeMode.Adjust)
- self.setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
- self.setSizePolicy(QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Fixed)
- self.setFocusPolicy(Qt.FocusPolicy.NoFocus)
- self.setFlow(QListView.Flow.LeftToRight)
+ self.setResizeMode(widgets.QListView.ResizeMode.Adjust)
+ self.setVerticalScrollBarPolicy(core.Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
+ self.setSizePolicy(widgets.QSizePolicy.Policy.MinimumExpanding, widgets.QSizePolicy.Policy.Fixed)
+ self.setFocusPolicy(core.Qt.FocusPolicy.NoFocus)
+ self.setFlow(widgets.QListView.Flow.LeftToRight)
self.setSpacing(1)
self._menu = None
model.rowsInserted.connect(self._update_geometry)
@@ -74,7 +72,7 @@ class DownloadView(QListView):
model.dataChanged.connect(self._update_geometry)
self.setModel(model)
self.setWrapping(True)
- self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
+ self.setContextMenuPolicy(core.Qt.ContextMenuPolicy.CustomContextMenu)
self.customContextMenuRequested.connect(self.show_context_menu)
self.clicked.connect(self.on_clicked)
@@ -95,7 +93,7 @@ class DownloadView(QListView):
assert isinstance(model, downloads.DownloadModel), model
return model
- @pyqtSlot()
+ @core.pyqtSlot()
def _update_geometry(self):
"""Wrapper to call updateGeometry.
@@ -104,7 +102,7 @@ class DownloadView(QListView):
"""
self.updateGeometry()
- @pyqtSlot(bool)
+ @core.pyqtSlot(bool)
def on_fullscreen_requested(self, on):
"""Hide/show the downloadview when entering/leaving fullscreen."""
if on:
@@ -112,7 +110,7 @@ class DownloadView(QListView):
else:
self.show()
- @pyqtSlot('QModelIndex')
+ @core.pyqtSlot('QModelIndex')
def on_clicked(self, index):
"""Handle clicking of an item.
@@ -158,7 +156,7 @@ class DownloadView(QListView):
actions.append(("Remove all finished", model.download_clear))
return actions
- @pyqtSlot('QPoint')
+ @core.pyqtSlot('QPoint')
def show_context_menu(self, point):
"""Show the context menu."""
index = self.indexAt(point)
@@ -166,7 +164,7 @@ class DownloadView(QListView):
item = self._model().data(index, downloads.ModelRole.item)
else:
item = None
- self._menu = QMenu(self)
+ self._menu = widgets.QMenu(self)
actions = self._get_menu_actions(item)
for (name, handler) in actions:
if name is None and handler is None:
@@ -191,8 +189,8 @@ class DownloadView(QListView):
margins = self.contentsMargins()
height = (bottom + margins.top() + margins.bottom() +
2 * self.spacing())
- size = QSize(0, height)
+ size = core.QSize(0, height)
else:
- size = QSize(0, 0)
+ size = core.QSize(0, 0)
qtutils.ensure_valid(size)
return size
diff --git a/qutebrowser/browser/eventfilter.py b/qutebrowser/browser/eventfilter.py
index 616798f9b..8d8d351b2 100644
--- a/qutebrowser/browser/eventfilter.py
+++ b/qutebrowser/browser/eventfilter.py
@@ -19,15 +19,14 @@
"""Event handling for a browser tab."""
-from qutebrowser.qt import machinery
-from qutebrowser.qt.core import QObject, QEvent, Qt, QTimer
+from qutebrowser.qt import core, machinery
from qutebrowser.config import config
from qutebrowser.utils import log, message, usertypes
from qutebrowser.keyinput import modeman
-class ChildEventFilter(QObject):
+class ChildEventFilter(core.QObject):
"""An event filter re-adding TabEventFilter on ChildEvent.
@@ -48,7 +47,7 @@ class ChildEventFilter(QObject):
def eventFilter(self, obj, event):
"""Act on ChildAdded events."""
- if event.type() == QEvent.Type.ChildAdded:
+ if event.type() == core.QEvent.Type.ChildAdded:
child = event.child()
log.misc.debug("{} got new child {}, installing filter"
.format(obj, child))
@@ -58,14 +57,14 @@ class ChildEventFilter(QObject):
assert obj is self._widget
child.installEventFilter(self._filter)
- elif event.type() == QEvent.Type.ChildRemoved:
+ elif event.type() == core.QEvent.Type.ChildRemoved:
child = event.child()
log.misc.debug("{}: removed child {}".format(obj, child))
return False
-class TabEventFilter(QObject):
+class TabEventFilter(core.QObject):
"""Handle mouse/keyboard events on a tab.
@@ -81,9 +80,9 @@ class TabEventFilter(QObject):
super().__init__(parent)
self._tab = tab
self._handlers = {
- QEvent.Type.MouseButtonPress: self._handle_mouse_press,
- QEvent.Type.MouseButtonRelease: self._handle_mouse_release,
- QEvent.Type.Wheel: self._handle_wheel,
+ core.QEvent.Type.MouseButtonPress: self._handle_mouse_press,
+ core.QEvent.Type.MouseButtonRelease: self._handle_mouse_release,
+ core.QEvent.Type.Wheel: self._handle_wheel,
}
self._ignore_wheel_event = False
self._check_insertmode_on_release = False
@@ -98,9 +97,9 @@ class TabEventFilter(QObject):
True if the event should be filtered, False otherwise.
"""
is_rocker_gesture = (config.val.input.mouse.rocker_gestures and
- e.buttons() == Qt.MouseButton.LeftButton | Qt.MouseButton.RightButton)
+ e.buttons() == core.Qt.MouseButton.LeftButton | core.Qt.MouseButton.RightButton)
- if e.button() in [Qt.MouseButton.XButton1, Qt.MouseButton.XButton2] or is_rocker_gesture:
+ if e.button() in [core.Qt.MouseButton.XButton1, core.Qt.MouseButton.XButton2] or is_rocker_gesture:
if not machinery.IS_QT6:
self._mousepress_backforward(e)
# FIXME:qt6 For some reason, this doesn't filter the action on
@@ -114,7 +113,7 @@ class TabEventFilter(QObject):
log.mouse.warning("Ignoring invalid click at {}".format(pos))
return False
- if e.button() != Qt.MouseButton.NoButton:
+ if e.button() != core.Qt.MouseButton.NoButton:
self._tab.elements.find_at_pos(pos, self._mousepress_insertmode_cb)
return False
@@ -130,7 +129,7 @@ class TabEventFilter(QObject):
"""
# We want to make sure we check the focus element after the WebView is
# updated completely.
- QTimer.singleShot(0, self._mouserelease_insertmode)
+ core.QTimer.singleShot(0, self._mouserelease_insertmode)
return False
def _handle_wheel(self, e):
@@ -152,7 +151,7 @@ class TabEventFilter(QObject):
if mode == usertypes.KeyMode.hint:
return True
- elif e.modifiers() & Qt.KeyboardModifier.ControlModifier:
+ elif e.modifiers() & core.Qt.KeyboardModifier.ControlModifier:
if mode == usertypes.KeyMode.passthrough:
return False
@@ -227,17 +226,17 @@ class TabEventFilter(QObject):
True if the event should be filtered, False otherwise.
"""
if (not config.val.input.mouse.back_forward_buttons and
- e.button() in [Qt.MouseButton.XButton1, Qt.MouseButton.XButton2]):
+ e.button() in [core.Qt.MouseButton.XButton1, core.Qt.MouseButton.XButton2]):
# Back and forward on mice are disabled
return
- if e.button() in [Qt.MouseButton.XButton1, Qt.MouseButton.LeftButton]:
+ if e.button() in [core.Qt.MouseButton.XButton1, core.Qt.MouseButton.LeftButton]:
# Back button on mice which have it, or rocker gesture
if self._tab.history.can_go_back():
self._tab.history.back()
else:
message.error("At beginning of history.")
- elif e.button() in [Qt.MouseButton.XButton2, Qt.MouseButton.RightButton]:
+ elif e.button() in [core.Qt.MouseButton.XButton2, core.Qt.MouseButton.RightButton]:
# Forward button on mice which have it, or rocker gesture
if self._tab.history.can_go_forward():
self._tab.history.forward()
diff --git a/qutebrowser/browser/greasemonkey.py b/qutebrowser/browser/greasemonkey.py
index a0cdf0fcc..88a3dd15c 100644
--- a/qutebrowser/browser/greasemonkey.py
+++ b/qutebrowser/browser/greasemonkey.py
@@ -29,13 +29,12 @@ import textwrap
import dataclasses
from typing import cast, List, Sequence, Tuple, Optional
-from qutebrowser.qt.core import pyqtSignal, QObject, QUrl
-
from qutebrowser.utils import (log, standarddir, jinja, objreg, utils,
javascript, urlmatch, version, usertypes, message)
from qutebrowser.api import cmdutils
from qutebrowser.browser import downloads
from qutebrowser.misc import objects
+from qutebrowser.qt import core
gm_manager = cast('GreasemonkeyManager', None)
@@ -221,7 +220,7 @@ class MatchingScripts:
"""All userscripts registered to run on a particular url."""
- url: QUrl
+ url: core.QUrl
start: List[GreasemonkeyScript] = dataclasses.field(default_factory=list)
end: List[GreasemonkeyScript] = dataclasses.field(default_factory=list)
idle: List[GreasemonkeyScript] = dataclasses.field(default_factory=list)
@@ -270,7 +269,7 @@ class GreasemonkeyMatcher:
def __init__(self, url):
self._url = url
- self._url_string = url.toString(QUrl.ComponentFormattingOption.FullyEncoded)
+ self._url_string = url.toString(core.QUrl.ComponentFormattingOption.FullyEncoded)
self.is_greaseable = url.scheme() in self.GREASEABLE_SCHEMES
def _match_pattern(self, pattern):
@@ -295,7 +294,7 @@ class GreasemonkeyMatcher:
return (matching_includes or matching_match) and not matching_excludes
-class GreasemonkeyManager(QObject):
+class GreasemonkeyManager(core.QObject):
"""Manager of userscripts and a Greasemonkey compatible environment.
@@ -305,7 +304,7 @@ class GreasemonkeyManager(QObject):
considered obsolete.
"""
- scripts_reloaded = pyqtSignal()
+ scripts_reloaded = core.pyqtSignal()
def __init__(self, parent=None):
super().__init__(parent)
@@ -444,7 +443,7 @@ class GreasemonkeyManager(QObject):
for url, target_path in required_dls:
target = downloads.FileDownloadTarget(target_path,
force_overwrite=True)
- download = download_manager.get(QUrl(url), target=target,
+ download = download_manager.get(core.QUrl(url), target=target,
auto_remove=True)
# FIXME:mypy Build this into downloads instead of patching here?
download.requested_url = url
diff --git a/qutebrowser/browser/hints.py b/qutebrowser/browser/hints.py
index 91534a58b..ceefa7c78 100644
--- a/qutebrowser/browser/hints.py
+++ b/qutebrowser/browser/hints.py
@@ -29,9 +29,7 @@ import dataclasses
from string import ascii_lowercase
from typing import (TYPE_CHECKING, Callable, Dict, Iterable, Iterator, List, Mapping,
MutableSequence, Optional, Sequence, Set)
-
-from qutebrowser.qt.core import pyqtSignal, pyqtSlot, QObject, Qt, QUrl
-from qutebrowser.qt.widgets import QLabel
+from qutebrowser.qt import widgets
from qutebrowser.config import config, configexc
from qutebrowser.keyinput import modeman, modeparsers, basekeyparser
@@ -39,6 +37,8 @@ from qutebrowser.browser import webelem, history
from qutebrowser.commands import runners
from qutebrowser.api import cmdutils
from qutebrowser.utils import usertypes, log, qtutils, message, objreg, utils
+from qutebrowser.qt import core
+
if TYPE_CHECKING:
from qutebrowser.browser import browsertab
@@ -77,7 +77,7 @@ def on_mode_entered(mode: usertypes.KeyMode, win_id: int) -> None:
maybe=True)
-class HintLabel(QLabel):
+class HintLabel(widgets.QLabel):
"""A label for a link.
@@ -92,12 +92,12 @@ class HintLabel(QLabel):
self._context = context
self.elem = elem
- self.setTextFormat(Qt.TextFormat.RichText)
+ self.setTextFormat(core.Qt.TextFormat.RichText)
# Make sure we can style the background via a style sheet, and we don't
# get any extra text indent from Qt.
# The real stylesheet lives in mainwindow.py for performance reasons..
- self.setAttribute(Qt.WidgetAttribute.WA_StyledBackground, True)
+ self.setAttribute(core.Qt.WidgetAttribute.WA_StyledBackground, True)
self.setIndent(0)
self._context.tab.contents_size_changed.connect(self._move_to_elem)
@@ -134,7 +134,7 @@ class HintLabel(QLabel):
self.setText(unmatched)
self.adjustSize()
- @pyqtSlot()
+ @core.pyqtSlot()
def _move_to_elem(self) -> None:
"""Reposition the label to its element."""
if not self.elem.has_frame():
@@ -189,7 +189,7 @@ class HintContext:
hint_mode: str
add_history: bool
first: bool
- baseurl: QUrl
+ baseurl: core.QUrl
args: List[str]
group: str
@@ -247,14 +247,14 @@ class HintActions:
except webelem.Error as e:
raise HintingError(str(e))
- def yank(self, url: QUrl, context: HintContext) -> None:
+ def yank(self, url: core.QUrl, context: HintContext) -> None:
"""Yank an element to the clipboard or primary selection."""
sel = (context.target == Target.yank_primary and
utils.supports_selection())
- flags = QUrl.ComponentFormattingOption.FullyEncoded | QUrl.UrlFormattingOption.RemovePassword
+ flags = core.QUrl.ComponentFormattingOption.FullyEncoded | core.QUrl.UrlFormattingOption.RemovePassword
if url.scheme() == 'mailto':
- flags |= QUrl.UrlFormattingOption.RemoveScheme
+ flags |= core.QUrl.UrlFormattingOption.RemoveScheme
urlstr = url.toString(flags)
new_content = urlstr
@@ -274,16 +274,16 @@ class HintActions:
urlstr)
message.info(msg, replace='rapid-hints' if context.rapid else None)
- def run_cmd(self, url: QUrl, context: HintContext) -> None:
+ def run_cmd(self, url: core.QUrl, context: HintContext) -> None:
"""Run the command based on a hint URL."""
- urlstr = url.toString(QUrl.ComponentFormattingOption.FullyEncoded) # type: ignore[arg-type]
+ urlstr = url.toString(core.QUrl.ComponentFormattingOption.FullyEncoded) # type: ignore[arg-type]
args = context.get_args(urlstr)
commandrunner = runners.CommandRunner(self._win_id)
commandrunner.run_safely(' '.join(args))
- def preset_cmd_text(self, url: QUrl, context: HintContext) -> None:
+ def preset_cmd_text(self, url: core.QUrl, context: HintContext) -> None:
"""Preset a commandline text based on a hint URL."""
- flags = QUrl.ComponentFormattingOption.FullyEncoded
+ flags = core.QUrl.ComponentFormattingOption.FullyEncoded
urlstr = url.toDisplayString(flags) # type: ignore[arg-type]
args = context.get_args(urlstr)
text = ' '.join(args)
@@ -325,7 +325,7 @@ class HintActions:
cmd = context.args[0]
args = context.args[1:]
- flags = QUrl.ComponentFormattingOption.FullyEncoded
+ flags = core.QUrl.ComponentFormattingOption.FullyEncoded
env = {
'QUTE_MODE': 'hints',
@@ -349,7 +349,7 @@ class HintActions:
_context: HintContext) -> None:
elem.delete()
- def spawn(self, url: QUrl, context: HintContext) -> None:
+ def spawn(self, url: core.QUrl, context: HintContext) -> None:
"""Spawn a simple command from a hint.
Args:
@@ -357,7 +357,7 @@ class HintActions:
context: The HintContext to use.
"""
urlstr = url.toString(
- QUrl.ComponentFormattingOption.FullyEncoded | QUrl.UrlFormattingOption.RemovePassword)
+ core.QUrl.ComponentFormattingOption.FullyEncoded | core.QUrl.UrlFormattingOption.RemovePassword)
args = context.get_args(urlstr)
commandrunner = runners.CommandRunner(self._win_id)
commandrunner.run_safely('spawn ' + ' '.join(args))
@@ -367,7 +367,7 @@ _ElemsType = Sequence[webelem.AbstractWebElement]
_HintStringsType = MutableSequence[str]
-class HintManager(QObject):
+class HintManager(core.QObject):
"""Manage drawing hints over links or other elements.
@@ -402,9 +402,9 @@ class HintManager(QObject):
Target.delete: "Delete an element",
}
- set_text = pyqtSignal(str)
+ set_text = core.pyqtSignal(str)
- def __init__(self, win_id: int, parent: QObject = None) -> None:
+ def __init__(self, win_id: int, parent: core.QObject = None) -> None:
"""Constructor."""
super().__init__(parent)
self._win_id = win_id
@@ -858,7 +858,7 @@ class HintManager(QObject):
# unpacking gets us the first (and only) key in the dict.
self._fire(*visible)
- @pyqtSlot(str)
+ @core.pyqtSlot(str)
def handle_partial_key(self, keystr: str) -> None:
"""Handle a new partial keypress."""
if self._context is None:
@@ -1032,7 +1032,7 @@ class HintManager(QObject):
else:
self._fire(keystring)
- @pyqtSlot(usertypes.KeyMode)
+ @core.pyqtSlot(usertypes.KeyMode)
def on_mode_left(self, mode: usertypes.KeyMode) -> None:
"""Stop hinting when hinting mode was left."""
if mode != usertypes.KeyMode.hint or self._context is None:
diff --git a/qutebrowser/browser/history.py b/qutebrowser/browser/history.py
index 312edfc13..bf2277188 100644
--- a/qutebrowser/browser/history.py
+++ b/qutebrowser/browser/history.py
@@ -25,13 +25,11 @@ import contextlib
import pathlib
from typing import cast, Mapping, MutableSequence, Optional
-from qutebrowser.qt.core import pyqtSlot, QUrl, QObject, pyqtSignal
-from qutebrowser.qt.widgets import QProgressDialog, QApplication
-
from qutebrowser.config import config
from qutebrowser.api import cmdutils
from qutebrowser.utils import utils, log, usertypes, message, qtutils
from qutebrowser.misc import objects, sql
+from qutebrowser.qt import widgets, core
web_history = cast('WebHistory', None)
@@ -52,27 +50,27 @@ class HistoryProgress:
def start(self, text):
"""Start showing a progress dialog."""
- self._progress = QProgressDialog()
+ self._progress = widgets.QProgressDialog()
self._progress.setMaximum(0) # unknown
self._progress.setMinimumDuration(0)
self._progress.setLabelText(text)
self._progress.setCancelButton(None)
self._progress.setAutoClose(False)
self._progress.show()
- QApplication.processEvents()
+ widgets.QApplication.processEvents()
def set_maximum(self, maximum):
"""Set the progress maximum as soon as we know about it."""
assert self._progress is not None
self._progress.setMaximum(maximum)
- QApplication.processEvents()
+ widgets.QApplication.processEvents()
def tick(self):
"""Increase the displayed progress value."""
self._value += 1
if self._progress is not None:
self._progress.setValue(self._value)
- QApplication.processEvents()
+ widgets.QApplication.processEvents()
def finish(self):
"""Finish showing the progress dialog.
@@ -93,7 +91,7 @@ class CompletionMetaInfo(sql.SqlTable):
}
def __init__(self, database: sql.Database,
- parent: Optional[QObject] = None) -> None:
+ parent: Optional[core.QObject] = None) -> None:
self._fields = ['key', 'value']
self._constraints = {'key': 'PRIMARY KEY'}
super().__init__(database, "CompletionMetaInfo", self._fields,
@@ -141,7 +139,7 @@ class CompletionHistory(sql.SqlTable):
"""History which only has the newest entry for each URL."""
def __init__(self, database: sql.Database,
- parent: Optional[QObject] = None) -> None:
+ parent: Optional[core.QObject] = None) -> None:
super().__init__(database, "CompletionHistory", ['url', 'title', 'last_atime'],
constraints={'url': 'PRIMARY KEY',
'title': 'NOT NULL',
@@ -161,12 +159,12 @@ class WebHistory(sql.SqlTable):
"""
# All web history cleared
- history_cleared = pyqtSignal()
+ history_cleared = core.pyqtSignal()
# one url cleared
- url_cleared = pyqtSignal(QUrl)
+ url_cleared = core.pyqtSignal(core.QUrl)
def __init__(self, database: sql.Database, progress: HistoryProgress,
- parent: Optional[QObject] = None) -> None:
+ parent: Optional[core.QObject] = None) -> None:
super().__init__(database, "History", ['url', 'title', 'atime', 'redirect'],
constraints={'url': 'NOT NULL',
'title': 'NOT NULL',
@@ -300,14 +298,14 @@ class WebHistory(sql.SqlTable):
# Delete old entries
self.completion.delete_all()
- QApplication.processEvents()
+ widgets.QApplication.processEvents()
# Select the latest entry for each url
q = self.database.query('SELECT url, title, max(atime) AS atime FROM History '
'WHERE NOT redirect '
'GROUP BY url ORDER BY atime asc')
result = q.run()
- QApplication.processEvents()
+ widgets.QApplication.processEvents()
entries = list(result)
self._progress.set_maximum(len(entries))
@@ -315,7 +313,7 @@ class WebHistory(sql.SqlTable):
for entry in entries:
self._progress.tick()
- url = QUrl(entry.url)
+ url = core.QUrl(entry.url)
if self._is_excluded_from_completion(url):
continue
data['url'].append(self._format_completion_url(url))
@@ -326,10 +324,10 @@ class WebHistory(sql.SqlTable):
# We might have caused fragmentation - let's clean up.
self.database.query('VACUUM').run()
- QApplication.processEvents()
+ widgets.QApplication.processEvents()
self.completion.insert_batch(data, replace=True)
- QApplication.processEvents()
+ widgets.QApplication.processEvents()
self._progress.finish()
self.metainfo['force_rebuild'] = False
@@ -373,7 +371,7 @@ class WebHistory(sql.SqlTable):
Args:
url: URL string to delete.
"""
- qurl = QUrl(url)
+ qurl = core.QUrl(url)
qtutils.ensure_valid(qurl)
self.delete('url', self._format_url(qurl))
self.completion.delete('url', self._format_completion_url(qurl))
@@ -381,7 +379,7 @@ class WebHistory(sql.SqlTable):
self._last_url = None
self.url_cleared.emit(qurl)
- @pyqtSlot(QUrl, QUrl, str)
+ @core.pyqtSlot(core.QUrl, core.QUrl, str)
def add_from_tab(self, url, requested_url, title):
"""Add a new history entry as slot, called from a BrowserTab."""
if self._is_excluded_entirely(url) or self._is_excluded_entirely(requested_url):
@@ -390,7 +388,7 @@ class WebHistory(sql.SqlTable):
# things set via setHtml
return
- no_formatting = QUrl.UrlFormattingOption(0)
+ no_formatting = core.QUrl.UrlFormattingOption(0)
if (requested_url.isValid() and
not requested_url.matches(url, no_formatting)):
# If the url of the page is different than the url of the link
@@ -435,10 +433,10 @@ class WebHistory(sql.SqlTable):
}, replace=True)
def _format_url(self, url):
- return url.toString(QUrl.UrlFormattingOption.RemovePassword | QUrl.ComponentFormattingOption.FullyEncoded)
+ return url.toString(core.QUrl.UrlFormattingOption.RemovePassword | core.QUrl.ComponentFormattingOption.FullyEncoded)
def _format_completion_url(self, url):
- return url.toString(QUrl.UrlFormattingOption.RemovePassword)
+ return url.toString(core.QUrl.UrlFormattingOption.RemovePassword)
@cmdutils.register()
@@ -479,7 +477,7 @@ def debug_dump_history(dest):
raise cmdutils.CommandError(f'Could not write history: {e}')
-def init(db_path: pathlib.Path, parent: Optional[QObject] = None) -> None:
+def init(db_path: pathlib.Path, parent: Optional[core.QObject] = None) -> None:
"""Initialize the web history.
Args:
diff --git a/qutebrowser/browser/inspector.py b/qutebrowser/browser/inspector.py
index dcf718552..91082489e 100644
--- a/qutebrowser/browser/inspector.py
+++ b/qutebrowser/browser/inspector.py
@@ -24,15 +24,15 @@ import binascii
import enum
from typing import cast, Optional, Any
-from qutebrowser.qt.widgets import QWidget
-from qutebrowser.qt.core import pyqtSignal, pyqtSlot, QObject, QEvent
-from qutebrowser.qt.gui import QCloseEvent
+from qutebrowser.qt import widgets
+from qutebrowser.qt import gui
from qutebrowser.browser import eventfilter
from qutebrowser.config import configfiles, config
from qutebrowser.utils import log, usertypes
from qutebrowser.keyinput import modeman
from qutebrowser.misc import miscwidgets
+from qutebrowser.qt import core
# FIXME:mypy How to annotate this properly without running into Liskov issues?
@@ -55,7 +55,7 @@ class Error(Exception):
"""Raised when the inspector could not be initialized."""
-class _EventFilter(QObject):
+class _EventFilter(core.QObject):
"""Event filter to enter insert mode when inspector was clicked.
@@ -70,16 +70,16 @@ class _EventFilter(QObject):
the QWebInspector.
"""
- clicked = pyqtSignal()
+ clicked = core.pyqtSignal()
- def eventFilter(self, _obj: QObject, event: QEvent) -> bool:
+ def eventFilter(self, _obj: core.QObject, event: core.QEvent) -> bool:
"""Translate mouse presses to a clicked signal."""
- if event.type() == QEvent.Type.MouseButtonPress:
+ if event.type() == core.QEvent.Type.MouseButtonPress:
self.clicked.emit()
return False
-class AbstractWebInspector(QWidget):
+class AbstractWebInspector(widgets.QWidget):
"""Base class for QtWebKit/QtWebEngine inspectors.
@@ -91,11 +91,11 @@ class AbstractWebInspector(QWidget):
recreate: Emitted when the inspector should be recreated.
"""
- recreate = pyqtSignal()
+ recreate = core.pyqtSignal()
def __init__(self, splitter: 'miscwidgets.InspectorSplitter',
win_id: int,
- parent: QWidget = None) -> None:
+ parent: widgets.QWidget = None) -> None:
super().__init__(parent)
self._widget = cast(_WidgetType, None)
self._layout = miscwidgets.WrapperLayout(self)
@@ -134,7 +134,7 @@ class AbstractWebInspector(QWidget):
"""
return False
- @pyqtSlot()
+ @core.pyqtSlot()
def _on_clicked(self) -> None:
"""Enter insert mode if a docked inspector was clicked."""
if (self._position != Position.window and
@@ -197,7 +197,7 @@ class AbstractWebInspector(QWidget):
if not ok:
log.init.warning("Error while loading geometry.")
- def closeEvent(self, _e: QCloseEvent) -> None:
+ def closeEvent(self, _e: gui.QCloseEvent) -> None:
"""Save the geometry when closed."""
data = self._widget.saveGeometry().data()
geom = base64.b64encode(data).decode('ASCII')
@@ -208,7 +208,7 @@ class AbstractWebInspector(QWidget):
"""Inspect the given QWeb(Engine)Page."""
raise NotImplementedError
- @pyqtSlot()
+ @core.pyqtSlot()
def shutdown(self) -> None:
"""Clean up the inspector."""
self.close()
diff --git a/qutebrowser/browser/navigate.py b/qutebrowser/browser/navigate.py
index d2783e349..38393ffb4 100644
--- a/qutebrowser/browser/navigate.py
+++ b/qutebrowser/browser/navigate.py
@@ -23,7 +23,7 @@ import re
import posixpath
from typing import Optional, Set
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import core
from qutebrowser.browser import webelem
from qutebrowser.config import config
@@ -42,24 +42,24 @@ class Error(Exception):
# of information. (host and path use FullyDecoded by default)
_URL_SEGMENTS = [
('host',
- lambda url: url.host(QUrl.ComponentFormattingOption.FullyEncoded),
- lambda url, host: url.setHost(host, QUrl.ParsingMode.StrictMode)),
+ lambda url: url.host(core.QUrl.ComponentFormattingOption.FullyEncoded),
+ lambda url, host: url.setHost(host, core.QUrl.ParsingMode.StrictMode)),
('port',
lambda url: str(url.port()) if url.port() > 0 else '',
lambda url, x: url.setPort(int(x))),
('path',
- lambda url: url.path(QUrl.ComponentFormattingOption.FullyEncoded),
- lambda url, path: url.setPath(path, QUrl.ParsingMode.StrictMode)),
+ lambda url: url.path(core.QUrl.ComponentFormattingOption.FullyEncoded),
+ lambda url, path: url.setPath(path, core.QUrl.ParsingMode.StrictMode)),
('query',
- lambda url: url.query(QUrl.ComponentFormattingOption.FullyEncoded),
- lambda url, query: url.setQuery(query, QUrl.ParsingMode.StrictMode)),
+ lambda url: url.query(core.QUrl.ComponentFormattingOption.FullyEncoded),
+ lambda url, query: url.setQuery(query, core.QUrl.ParsingMode.StrictMode)),
('anchor',
- lambda url: url.fragment(QUrl.ComponentFormattingOption.FullyEncoded),
- lambda url, fragment: url.setFragment(fragment, QUrl.ParsingMode.StrictMode)),
+ lambda url: url.fragment(core.QUrl.ComponentFormattingOption.FullyEncoded),
+ lambda url, fragment: url.setFragment(fragment, core.QUrl.ParsingMode.StrictMode)),
]
@@ -102,7 +102,7 @@ def incdec(url, count, inc_or_dec):
segments = {'path', 'query'}
# Make a copy of the QUrl so we don't modify the original
- url = QUrl(url)
+ url = core.QUrl(url)
# We're searching the last number so we walk the url segments backwards
for segment, getter, setter in reversed(_URL_SEGMENTS):
if segment not in segments:
@@ -130,14 +130,14 @@ def path_up(url, count):
count: The number of levels to go up in the url.
"""
urlutils.ensure_valid(url)
- url = url.adjusted(QUrl.UrlFormattingOption.RemoveFragment | QUrl.UrlFormattingOption.RemoveQuery)
- path = url.path(QUrl.ComponentFormattingOption.FullyEncoded)
+ url = url.adjusted(core.QUrl.UrlFormattingOption.RemoveFragment | core.QUrl.UrlFormattingOption.RemoveQuery)
+ path = url.path(core.QUrl.ComponentFormattingOption.FullyEncoded)
if not path or path == '/':
raise Error("Can't go up!")
for _i in range(0, min(count, path.count('/'))):
path = posixpath.join(path, posixpath.pardir)
path = posixpath.normpath(path)
- url.setPath(path, QUrl.ParsingMode.StrictMode)
+ url.setPath(path, core.QUrl.ParsingMode.StrictMode)
return url
@@ -146,7 +146,7 @@ def strip(url, count):
if count != 1:
raise Error("Count is not supported when stripping URL components")
urlutils.ensure_valid(url)
- return url.adjusted(QUrl.UrlFormattingOption.RemoveFragment | QUrl.UrlFormattingOption.RemoveQuery)
+ return url.adjusted(core.QUrl.UrlFormattingOption.RemoveFragment | core.QUrl.UrlFormattingOption.RemoveQuery)
def _find_prevnext(prev, elems):
diff --git a/qutebrowser/browser/network/pac.py b/qutebrowser/browser/network/pac.py
index be25a2a41..df3bd1466 100644
--- a/qutebrowser/browser/network/pac.py
+++ b/qutebrowser/browser/network/pac.py
@@ -23,13 +23,8 @@ import sys
import functools
from typing import Optional
-from qutebrowser.qt.core import QObject, pyqtSignal, pyqtSlot, QUrl
-from qutebrowser.qt.network import (QNetworkProxy, QNetworkRequest, QHostInfo,
- QNetworkReply, QNetworkAccessManager,
- QHostAddress)
-from qutebrowser.qt.qml import QJSEngine, QJSValue
-
from qutebrowser.utils import log, utils, qtutils, resources
+from qutebrowser.qt import qml, network, core
class ParseProxyError(Exception):
@@ -66,12 +61,12 @@ def _js_slot(*args):
return self._error_con.callAsConstructor([e])
# pylint: enable=protected-access
- deco = pyqtSlot(*args, result=QJSValue)
+ deco = core.pyqtSlot(*args, result=qml.QJSValue)
return deco(new_method)
return _decorator
-class _PACContext(QObject):
+class _PACContext(core.QObject):
"""Implementation of PAC API functions that require native calls.
@@ -108,11 +103,11 @@ class _PACContext(QObject):
Args:
host: hostname to resolve.
"""
- ips = QHostInfo.fromName(host)
- if ips.error() != QHostInfo.HostInfoError.NoError or not ips.addresses():
+ ips = network.QHostInfo.fromName(host)
+ if ips.error() != network.QHostInfo.HostInfoError.NoError or not ips.addresses():
err_f = "Failed to resolve host during PAC evaluation: {}"
log.network.info(err_f.format(host))
- return QJSValue(QJSValue.SpecialValue.NullValue)
+ return qml.QJSValue(qml.QJSValue.SpecialValue.NullValue)
else:
return ips.addresses()[0].toString()
@@ -123,7 +118,7 @@ class _PACContext(QObject):
Return the server IP address of the current machine, as a string in
the dot-separated integer format.
"""
- return QHostAddress(QHostAddress.SpecialAddress.LocalHost).toString()
+ return network.QHostAddress(network.QHostAddress.SpecialAddress.LocalHost).toString()
class PACResolver:
@@ -150,17 +145,17 @@ class PACResolver:
if len(config) != 1:
raise ParseProxyError("Invalid number of parameters for " +
"DIRECT")
- return QNetworkProxy(QNetworkProxy.ProxyType.NoProxy)
+ return network.QNetworkProxy(network.QNetworkProxy.ProxyType.NoProxy)
elif config[0] == "PROXY":
if len(config) != 2:
raise ParseProxyError("Invalid number of parameters for PROXY")
host, port = PACResolver._parse_proxy_host(config[1])
- return QNetworkProxy(QNetworkProxy.ProxyType.HttpProxy, host, port)
+ return network.QNetworkProxy(network.QNetworkProxy.ProxyType.HttpProxy, host, port)
elif config[0] in ["SOCKS", "SOCKS5"]:
if len(config) != 2:
raise ParseProxyError("Invalid number of parameters for SOCKS")
host, port = PACResolver._parse_proxy_host(config[1])
- return QNetworkProxy(QNetworkProxy.ProxyType.Socks5Proxy, host, port)
+ return network.QNetworkProxy(network.QNetworkProxy.ProxyType.Socks5Proxy, host, port)
else:
err = "Unknown proxy type: {}"
raise ParseProxyError(err.format(config[0]))
@@ -182,9 +177,9 @@ class PACResolver:
Args:
pac_str: JavaScript code containing PAC resolver.
"""
- self._engine = QJSEngine()
+ self._engine = qml.QJSEngine()
- self._engine.installExtensions(QJSEngine.Extension.ConsoleExtension)
+ self._engine.installExtensions(qml.QJSEngine.Extension.ConsoleExtension)
self._ctx = _PACContext(self._engine)
self._engine.globalObject().setProperty(
@@ -215,12 +210,12 @@ class PACResolver:
qtutils.ensure_valid(query.url())
if from_file:
- string_flags = QUrl.ComponentFormattingOption.PrettyDecoded
+ string_flags = core.QUrl.ComponentFormattingOption.PrettyDecoded
else:
- string_flags = QUrl.UrlFormattingOption.RemoveUserInfo # type: ignore[assignment]
+ string_flags = core.QUrl.UrlFormattingOption.RemoveUserInfo # type: ignore[assignment]
if query.url().scheme() == 'https':
- string_flags |= QUrl.UrlFormattingOption.RemovePath # type: ignore[assignment]
- string_flags |= QUrl.UrlFormattingOption.RemoveQuery # type: ignore[assignment]
+ string_flags |= core.QUrl.UrlFormattingOption.RemovePath # type: ignore[assignment]
+ string_flags |= core.QUrl.UrlFormattingOption.RemoveQuery # type: ignore[assignment]
result = self._resolver.call([query.url().toString(string_flags),
query.peerHostName()])
@@ -231,11 +226,11 @@ class PACResolver:
return self._parse_proxy_string(result_str)
-class PACFetcher(QObject):
+class PACFetcher(core.QObject):
"""Asynchronous fetcher of PAC files."""
- finished = pyqtSignal()
+ finished = core.pyqtSignal()
def __init__(self, url, parent=None):
"""Resolve a PAC proxy from URL.
@@ -254,8 +249,8 @@ class PACFetcher(QObject):
with log.disable_qt_msghandler():
# WORKAROUND for a hang when messages are printed, see our
# NetworkAccessManager subclass for details.
- self._manager: Optional[QNetworkAccessManager] = QNetworkAccessManager()
- self._manager.setProxy(QNetworkProxy(QNetworkProxy.ProxyType.NoProxy))
+ self._manager: Optional[network.QNetworkAccessManager] = network.QNetworkAccessManager()
+ self._manager.setProxy(network.QNetworkProxy(network.QNetworkProxy.ProxyType.NoProxy))
self._pac = None
self._error_message = None
self._reply = None
@@ -269,13 +264,13 @@ class PACFetcher(QObject):
def fetch(self):
"""Fetch the proxy from the remote URL."""
assert self._manager is not None
- self._reply = self._manager.get(QNetworkRequest(self._pac_url))
+ self._reply = self._manager.get(network.QNetworkRequest(self._pac_url))
self._reply.finished.connect(self._finish)
- @pyqtSlot()
+ @core.pyqtSlot()
def _finish(self):
assert self._reply is not None
- if self._reply.error() != QNetworkReply.NetworkError.NoError:
+ if self._reply.error() != network.QNetworkReply.NetworkError.NoError:
error = "Can't fetch PAC file from URL, error code {}: {}"
self._error_message = error.format(
self._reply.error(), self._reply.errorString())
@@ -334,4 +329,4 @@ class PACFetcher(QObject):
# Later NetworkManager.createRequest will detect this and display
# an error message.
error_host = "pac-resolve-error.qutebrowser.invalid"
- return [QNetworkProxy(QNetworkProxy.ProxyType.HttpProxy, error_host, 9)]
+ return [network.QNetworkProxy(network.QNetworkProxy.ProxyType.HttpProxy, error_host, 9)]
diff --git a/qutebrowser/browser/network/proxy.py b/qutebrowser/browser/network/proxy.py
index 4022337c4..ed3c94983 100644
--- a/qutebrowser/browser/network/proxy.py
+++ b/qutebrowser/browser/network/proxy.py
@@ -19,13 +19,11 @@
"""Handling of proxies."""
-from qutebrowser.qt.core import QUrl, pyqtSlot
-from qutebrowser.qt.network import QNetworkProxy, QNetworkProxyFactory
-
from qutebrowser.config import config, configtypes
from qutebrowser.utils import message, usertypes, urlutils, utils
from qutebrowser.misc import objects
from qutebrowser.browser.network import pac
+from qutebrowser.qt import network, core
application_factory = None
@@ -35,7 +33,7 @@ def init():
"""Set the application wide proxy factory."""
global application_factory
application_factory = ProxyFactory()
- QNetworkProxyFactory.setApplicationProxyFactory(application_factory)
+ network.QNetworkProxyFactory.setApplicationProxyFactory(application_factory)
config.instance.changed.connect(_warn_for_pac)
_warn_for_pac()
@@ -50,13 +48,13 @@ def _warn_for_pac():
message.error("PAC support isn't implemented for QtWebEngine yet!")
-@pyqtSlot()
+@core.pyqtSlot()
def shutdown():
- QNetworkProxyFactory.setApplicationProxyFactory(
+ network.QNetworkProxyFactory.setApplicationProxyFactory(
None) # type: ignore[arg-type]
-class ProxyFactory(QNetworkProxyFactory):
+class ProxyFactory(network.QNetworkProxyFactory):
"""Factory for proxies to be used by qutebrowser."""
@@ -73,11 +71,11 @@ class ProxyFactory(QNetworkProxyFactory):
return None
def _set_capabilities(self, proxy):
- if proxy.type() == QNetworkProxy.ProxyType.NoProxy:
+ if proxy.type() == network.QNetworkProxy.ProxyType.NoProxy:
return
capabilities = proxy.capabilities()
- lookup_cap = QNetworkProxy.Capability.HostNameLookupCapability
+ lookup_cap = network.QNetworkProxy.Capability.HostNameLookupCapability
if config.val.content.proxy_dns_requests:
capabilities |= lookup_cap
else:
@@ -98,11 +96,11 @@ class ProxyFactory(QNetworkProxyFactory):
# On Linux, use "export http_proxy=socks5://host:port" to manually
# set system proxy.
# ref. https://doc.qt.io/qt-5/qnetworkproxyfactory.html#systemProxyForQuery
- proxies = QNetworkProxyFactory.systemProxyForQuery(query)
+ proxies = network.QNetworkProxyFactory.systemProxyForQuery(query)
elif isinstance(proxy, pac.PACFetcher):
if objects.backend == usertypes.Backend.QtWebEngine:
# Looks like query.url() is always invalid on QtWebEngine...
- proxy = urlutils.proxy_from_url(QUrl('direct://'))
+ proxy = urlutils.proxy_from_url(core.QUrl('direct://'))
assert not isinstance(proxy, pac.PACFetcher)
proxies = [proxy]
elif objects.backend == usertypes.Backend.QtWebKit:
diff --git a/qutebrowser/browser/pdfjs.py b/qutebrowser/browser/pdfjs.py
index 4b86b4c27..9c3ed97b8 100644
--- a/qutebrowser/browser/pdfjs.py
+++ b/qutebrowser/browser/pdfjs.py
@@ -22,10 +22,9 @@
import os
-from qutebrowser.qt.core import QUrl, QUrlQuery
-
from qutebrowser.utils import resources, javascript, jinja, standarddir, log
from qutebrowser.config import config
+from qutebrowser.qt import core
_SYSTEM_PATHS = [
@@ -90,13 +89,13 @@ def _generate_pdfjs_script(filename):
Args:
filename: The name of the file to open.
"""
- url = QUrl('qute://pdfjs/file')
- url_query = QUrlQuery()
+ url = core.QUrl('qute://pdfjs/file')
+ url_query = core.QUrlQuery()
url_query.addQueryItem('filename', filename)
url.setQuery(url_query)
js_url = javascript.to_js(
- url.toString(QUrl.ComponentFormattingOption.FullyEncoded)) # type: ignore[arg-type]
+ url.toString(core.QUrl.ComponentFormattingOption.FullyEncoded)) # type: ignore[arg-type]
return jinja.js_environment.from_string("""
document.addEventListener("DOMContentLoaded", function() {
@@ -225,19 +224,19 @@ def should_use_pdfjs(mimetype, url):
"""Check whether PDF.js should be used."""
# e.g. 'blob:qute%3A///b45250b3-787e-44d1-a8d8-c2c90f81f981'
is_download_url = (url.scheme() == 'blob' and
- QUrl(url.path()).scheme() == 'qute')
+ core.QUrl(url.path()).scheme() == 'qute')
is_pdf = mimetype in ['application/pdf', 'application/x-pdf']
config_enabled = config.instance.get('content.pdfjs', url=url)
return is_pdf and not is_download_url and config_enabled
-def get_main_url(filename: str, original_url: QUrl) -> QUrl:
+def get_main_url(filename: str, original_url: core.QUrl) -> core.QUrl:
"""Get the URL to be opened to view a local PDF."""
- url = QUrl('qute://pdfjs/web/viewer.html')
- query = QUrlQuery()
+ url = core.QUrl('qute://pdfjs/web/viewer.html')
+ query = core.QUrlQuery()
query.addQueryItem('filename', filename) # read from our JS
query.addQueryItem('file', '') # to avoid pdfjs opening the default PDF
- urlstr = original_url.toString(QUrl.ComponentFormattingOption.FullyEncoded) # type: ignore[arg-type]
+ urlstr = original_url.toString(core.QUrl.ComponentFormattingOption.FullyEncoded) # type: ignore[arg-type]
query.addQueryItem('source', urlstr)
url.setQuery(query)
return url
diff --git a/qutebrowser/browser/qtnetworkdownloads.py b/qutebrowser/browser/qtnetworkdownloads.py
index 586570390..3c782db84 100644
--- a/qutebrowser/browser/qtnetworkdownloads.py
+++ b/qutebrowser/browser/qtnetworkdownloads.py
@@ -25,10 +25,7 @@ import shutil
import functools
import dataclasses
from typing import Dict, IO, Optional
-
-from qutebrowser.qt.core import pyqtSlot, pyqtSignal, QTimer, QUrl
-from qutebrowser.qt.widgets import QApplication
-from qutebrowser.qt.network import QNetworkRequest, QNetworkReply, QNetworkAccessManager
+from qutebrowser.qt import widgets
from qutebrowser.config import config, websettings
from qutebrowser.utils import message, usertypes, log, urlutils, utils, debug, objreg
@@ -36,13 +33,14 @@ from qutebrowser.misc import quitter
from qutebrowser.browser import downloads
from qutebrowser.browser.webkit import http
from qutebrowser.browser.webkit.network import networkmanager
+from qutebrowser.qt import network, core
@dataclasses.dataclass
class _RetryInfo:
- request: QNetworkRequest
- manager: QNetworkAccessManager
+ request: network.QNetworkRequest
+ manager: network.QNetworkAccessManager
class DownloadItem(downloads.AbstractDownloadItem):
@@ -78,7 +76,7 @@ class DownloadItem(downloads.AbstractDownloadItem):
arg 0: The new DownloadItem
"""
- adopt_download = pyqtSignal(object) # DownloadItem
+ adopt_download = core.pyqtSignal(object) # DownloadItem
def __init__(self, reply, manager):
"""Constructor.
@@ -172,10 +170,10 @@ class DownloadItem(downloads.AbstractDownloadItem):
# We could have got signals before we connected slots to them.
# Here no signals are connected to the DownloadItem yet, so we use a
# singleShot QTimer to emit them after they are connected.
- if reply.error() != QNetworkReply.NetworkError.NoError:
- QTimer.singleShot(0, lambda: self._die(reply.errorString()))
+ if reply.error() != network.QNetworkReply.NetworkError.NoError:
+ core.QTimer.singleShot(0, lambda: self._die(reply.errorString()))
- @pyqtSlot(QUrl)
+ @core.pyqtSlot(core.QUrl)
def _on_redirected(self, url):
log.downloads.debug(f"redirected: {self._reply.url()} -> {url}")
@@ -190,7 +188,7 @@ class DownloadItem(downloads.AbstractDownloadItem):
self.fileobj.close()
self.cancelled.emit()
- @pyqtSlot()
+ @core.pyqtSlot()
def retry(self):
"""Retry a failed download."""
assert self.done
@@ -213,20 +211,20 @@ class DownloadItem(downloads.AbstractDownloadItem):
filename = getattr(self.fileobj, 'name', None)
return filename
- def url(self) -> QUrl:
+ def url(self) -> core.QUrl:
# Note: self._reply is deleted when the download finishes
return self._url
- def origin(self) -> QUrl:
+ def origin(self) -> core.QUrl:
if self._reply is None:
- return QUrl()
+ return core.QUrl()
origin = self._reply.request().originatingObject()
try:
return origin.url()
except AttributeError:
# Raised either if origin is None or some object that doesn't
# have its own url.
- return QUrl()
+ return core.QUrl()
def _ensure_can_set_filename(self, filename):
if self.fileobj is not None: # pragma: no cover
@@ -300,7 +298,7 @@ class DownloadItem(downloads.AbstractDownloadItem):
self.fileobj.write(self._reply.readAll())
if self._autoclose:
self.fileobj.close()
- self.successful = self._reply.error() == QNetworkReply.NetworkError.NoError
+ self.successful = self._reply.error() == network.QNetworkReply.NetworkError.NoError
self._reply.close()
self._reply.deleteLater()
self._reply = None
@@ -309,7 +307,7 @@ class DownloadItem(downloads.AbstractDownloadItem):
log.downloads.debug("Download {} finished".format(self.basename))
self.data_changed.emit()
- @pyqtSlot()
+ @core.pyqtSlot()
def _on_reply_finished(self):
"""Clean up when the download was finished.
@@ -327,7 +325,7 @@ class DownloadItem(downloads.AbstractDownloadItem):
# clean up.
self._finish_download()
- @pyqtSlot()
+ @core.pyqtSlot()
def _on_ready_read(self):
"""Read available data and save file when ready to read."""
if self.fileobj is None or self._reply is None:
@@ -342,21 +340,21 @@ class DownloadItem(downloads.AbstractDownloadItem):
except OSError as e:
self._die(e.strerror)
- @pyqtSlot('QNetworkReply::NetworkError')
+ @core.pyqtSlot('QNetworkReply::NetworkError')
def _on_reply_error(self, code):
"""Handle QNetworkReply errors."""
- if code == QNetworkReply.NetworkError.OperationCanceledError:
+ if code == network.QNetworkReply.NetworkError.OperationCanceledError:
return
if self._reply is None:
error = "Unknown error: {}".format(
- debug.qenum_key(QNetworkReply, code))
+ debug.qenum_key(network.QNetworkReply, code))
else:
error = self._reply.errorString()
self._die(error)
- @pyqtSlot()
+ @core.pyqtSlot()
def _on_read_timer_timeout(self):
"""Read some bytes from the QNetworkReply periodically."""
assert self._reply is not None
@@ -366,7 +364,7 @@ class DownloadItem(downloads.AbstractDownloadItem):
if data is not None:
self._buffer.write(data)
- @pyqtSlot()
+ @core.pyqtSlot()
def _on_meta_data_changed(self):
"""Update the download's metadata."""
if self._reply is None:
@@ -408,7 +406,7 @@ class DownloadManager(downloads.AbstractDownloadManager):
win_id=None, tab_id=None,
private=config.val.content.private_browsing, parent=self)
- @pyqtSlot('QUrl')
+ @core.pyqtSlot('QUrl')
def get(self, url, cache=True, **kwargs):
"""Start a download with a link URL.
@@ -424,18 +422,18 @@ class DownloadManager(downloads.AbstractDownloadManager):
urlutils.invalid_url_error(url, "start download")
return None
- req = QNetworkRequest(url)
+ req = network.QNetworkRequest(url)
user_agent = websettings.user_agent(url)
- req.setHeader(QNetworkRequest.KnownHeaders.UserAgentHeader, user_agent)
+ req.setHeader(network.QNetworkRequest.KnownHeaders.UserAgentHeader, user_agent)
if not cache:
- req.setAttribute(QNetworkRequest.Attribute.CacheSaveControlAttribute, False)
+ req.setAttribute(network.QNetworkRequest.Attribute.CacheSaveControlAttribute, False)
# Needed for Qt 5, default on Qt 6
# We don't set this on the QNAM because QtWebKit handles redirects manually.
req.setAttribute(
- QNetworkRequest.Attribute.RedirectPolicyAttribute,
- QNetworkRequest.RedirectPolicy.NoLessSafeRedirectPolicy,
+ network.QNetworkRequest.Attribute.RedirectPolicyAttribute,
+ network.QNetworkRequest.RedirectPolicy.NoLessSafeRedirectPolicy,
)
req.setMaximumRedirectsAllowed(self._MAX_REDIRECTS)
@@ -497,8 +495,8 @@ class DownloadManager(downloads.AbstractDownloadManager):
"""
# WORKAROUND for Qt corrupting data loaded from cache:
# https://bugreports.qt.io/browse/QTBUG-42757
- request.setAttribute(QNetworkRequest.Attribute.CacheLoadControlAttribute,
- QNetworkRequest.CacheLoadControl.AlwaysNetwork)
+ request.setAttribute(network.QNetworkRequest.Attribute.CacheLoadControlAttribute,
+ network.QNetworkRequest.CacheLoadControl.AlwaysNetwork)
if suggested_fn is None:
suggested_fn = self._get_suggested_filename(request)
@@ -524,7 +522,7 @@ class DownloadManager(downloads.AbstractDownloadManager):
reply = qnam.get(request)
return self.fetch(reply, **kwargs)
- @pyqtSlot('QNetworkReply')
+ @core.pyqtSlot('QNetworkReply')
def fetch(self, reply, *, target=None, auto_remove=False,
suggested_filename=None, prompt_download_directory=None):
"""Download a QNetworkReply to disk.
@@ -595,6 +593,6 @@ class DownloadManager(downloads.AbstractDownloadManager):
def init():
"""Initialize the global QtNetwork download manager."""
- download_manager = DownloadManager(parent=QApplication.instance())
+ download_manager = DownloadManager(parent=widgets.QApplication.instance())
objreg.register('qtnetwork-download-manager', download_manager)
quitter.instance.shutting_down.connect(download_manager.shutdown)
diff --git a/qutebrowser/browser/qutescheme.py b/qutebrowser/browser/qutescheme.py
index 322066c3f..0cf0aaa27 100644
--- a/qutebrowser/browser/qutescheme.py
+++ b/qutebrowser/browser/qutescheme.py
@@ -34,15 +34,13 @@ import collections
import secrets
from typing import TypeVar, Callable, Dict, List, Optional, Union, Sequence, Tuple
-from qutebrowser.qt.core import QUrlQuery, QUrl
-
import qutebrowser
from qutebrowser.browser import pdfjs, downloads, history
from qutebrowser.config import config, configdata, configexc
from qutebrowser.utils import (version, utils, jinja, log, message, docutils,
resources, objreg, standarddir)
from qutebrowser.misc import guiprocess, quitter
-from qutebrowser.qt import sip
+from qutebrowser.qt import core, sip
pyeval_output = ":pyeval was never called"
@@ -85,14 +83,14 @@ class Redirect(Exception):
url: The URL to redirect to, as a QUrl.
"""
- def __init__(self, url: QUrl):
+ def __init__(self, url: core.QUrl):
super().__init__(url.toDisplayString())
self.url = url
# Return value: (mimetype, data) (encoded as utf-8 if a str is returned)
_HandlerRet = Tuple[str, Union[str, bytes]]
-_HandlerCallable = Callable[[QUrl], _HandlerRet]
+_HandlerCallable = Callable[[core.QUrl], _HandlerRet]
_Handler = TypeVar('_Handler', bound=_HandlerCallable)
@@ -113,13 +111,13 @@ class add_handler: # noqa: N801,N806 pylint: disable=invalid-name
_HANDLERS[self._name] = self.wrapper
return function
- def wrapper(self, url: QUrl) -> _HandlerRet:
+ def wrapper(self, url: core.QUrl) -> _HandlerRet:
"""Call the underlying function."""
assert self._function is not None
return self._function(url)
-def data_for_url(url: QUrl) -> Tuple[str, bytes]:
+def data_for_url(url: core.QUrl) -> Tuple[str, bytes]:
"""Get the data to show for the given URL.
Args:
@@ -129,8 +127,8 @@ def data_for_url(url: QUrl) -> Tuple[str, bytes]:
A (mimetype, data) tuple.
"""
norm_url = url.adjusted(
- QUrl.UrlFormattingOption.NormalizePathSegments |
- QUrl.UrlFormattingOption.StripTrailingSlash)
+ core.QUrl.UrlFormattingOption.NormalizePathSegments |
+ core.QUrl.UrlFormattingOption.StripTrailingSlash)
if norm_url != url:
raise Redirect(norm_url)
@@ -141,7 +139,7 @@ def data_for_url(url: QUrl) -> Tuple[str, bytes]:
log.misc.debug("url: {}, path: {}, host {}".format(
url.toDisplayString(), path, host))
if not path or not host:
- new_url = QUrl()
+ new_url = core.QUrl()
new_url.setScheme('qute')
# When path is absent, e.g. qute://help (with no trailing slash)
if host:
@@ -177,7 +175,7 @@ def data_for_url(url: QUrl) -> Tuple[str, bytes]:
@add_handler('bookmarks')
-def qute_bookmarks(_url: QUrl) -> _HandlerRet:
+def qute_bookmarks(_url: core.QUrl) -> _HandlerRet:
"""Handler for qute://bookmarks. Display all quickmarks / bookmarks."""
bookmarks = sorted(objreg.get('bookmark-manager').marks.items(),
key=lambda x: x[1]) # Sort by title
@@ -192,7 +190,7 @@ def qute_bookmarks(_url: QUrl) -> _HandlerRet:
@add_handler('tabs')
-def qute_tabs(_url: QUrl) -> _HandlerRet:
+def qute_tabs(_url: core.QUrl) -> _HandlerRet:
"""Handler for qute://tabs. Display information about all open tabs."""
tabs: Dict[str, List[Tuple[str, str]]] = collections.defaultdict(list)
for win_id, window in objreg.window_registry.items():
@@ -202,7 +200,7 @@ def qute_tabs(_url: QUrl) -> _HandlerRet:
scope='window',
window=win_id)
for tab in tabbed_browser.widgets():
- if tab.url() not in [QUrl("qute://tabs/"), QUrl("qute://tabs")]:
+ if tab.url() not in [core.QUrl("qute://tabs/"), core.QUrl("qute://tabs")]:
urlstr = tab.url().toDisplayString()
tabs[str(win_id)].append((tab.title(), urlstr))
@@ -238,17 +236,17 @@ def history_data(
@add_handler('history')
-def qute_history(url: QUrl) -> _HandlerRet:
+def qute_history(url: core.QUrl) -> _HandlerRet:
"""Handler for qute://history. Display and serve history."""
if url.path() == '/data':
- q_offset = QUrlQuery(url).queryItemValue("offset")
+ q_offset = core.QUrlQuery(url).queryItemValue("offset")
try:
offset = int(q_offset) if q_offset else None
except ValueError:
raise UrlInvalidError("Query parameter offset is invalid")
# Use start_time in query or current time.
- q_start_time = QUrlQuery(url).queryItemValue("start_time")
+ q_start_time = core.QUrlQuery(url).queryItemValue("start_time")
try:
start_time = float(q_start_time) if q_start_time else time.time()
except ValueError:
@@ -264,7 +262,7 @@ def qute_history(url: QUrl) -> _HandlerRet:
@add_handler('javascript')
-def qute_javascript(url: QUrl) -> _HandlerRet:
+def qute_javascript(url: core.QUrl) -> _HandlerRet:
"""Handler for qute://javascript.
Return content of file given as query parameter.
@@ -278,14 +276,14 @@ def qute_javascript(url: QUrl) -> _HandlerRet:
@add_handler('pyeval')
-def qute_pyeval(_url: QUrl) -> _HandlerRet:
+def qute_pyeval(_url: core.QUrl) -> _HandlerRet:
"""Handler for qute://pyeval."""
src = jinja.render('pre.html', title='pyeval', content=pyeval_output)
return 'text/html', src
@add_handler('process')
-def qute_process(url: QUrl) -> _HandlerRet:
+def qute_process(url: core.QUrl) -> _HandlerRet:
"""Handler for qute://process."""
path = url.path()[1:]
try:
@@ -307,7 +305,7 @@ def qute_process(url: QUrl) -> _HandlerRet:
@add_handler('version')
@add_handler('verizon')
-def qute_version(_url: QUrl) -> _HandlerRet:
+def qute_version(_url: core.QUrl) -> _HandlerRet:
"""Handler for qute://version."""
src = jinja.render('version.html', title='Version info',
version=version.version_info(),
@@ -316,7 +314,7 @@ def qute_version(_url: QUrl) -> _HandlerRet:
@add_handler('log')
-def qute_log(url: QUrl) -> _HandlerRet:
+def qute_log(url: core.QUrl) -> _HandlerRet:
"""Handler for qute://log.
There are three query parameters:
@@ -330,7 +328,7 @@ def qute_log(url: QUrl) -> _HandlerRet:
- logfilter: A filter string like the --logfilter commandline argument
accepts.
"""
- query = QUrlQuery(url)
+ query = core.QUrlQuery(url)
plain = (query.hasQueryItem('plain') and
query.queryItemValue('plain').lower() != 'false')
@@ -358,7 +356,7 @@ def qute_log(url: QUrl) -> _HandlerRet:
@add_handler('gpl')
-def qute_gpl(_url: QUrl) -> _HandlerRet:
+def qute_gpl(_url: core.QUrl) -> _HandlerRet:
"""Handler for qute://gpl. Return HTML content as string."""
return 'text/html', resources.read_file('html/license.html')
@@ -373,7 +371,7 @@ def _asciidoc_fallback_path(html_path: str) -> Optional[str]:
@add_handler('help')
-def qute_help(url: QUrl) -> _HandlerRet:
+def qute_help(url: core.QUrl) -> _HandlerRet:
"""Handler for qute://help."""
urlpath = url.path()
if not urlpath or urlpath == '/':
@@ -422,11 +420,11 @@ def qute_help(url: QUrl) -> _HandlerRet:
return 'text/html', data
-def _qute_settings_set(url: QUrl) -> _HandlerRet:
+def _qute_settings_set(url: core.QUrl) -> _HandlerRet:
"""Handler for qute://settings/set."""
- query = QUrlQuery(url)
- option = query.queryItemValue('option', QUrl.ComponentFormattingOption.FullyDecoded)
- value = query.queryItemValue('value', QUrl.ComponentFormattingOption.FullyDecoded)
+ query = core.QUrlQuery(url)
+ option = query.queryItemValue('option', core.QUrl.ComponentFormattingOption.FullyDecoded)
+ value = query.queryItemValue('value', core.QUrl.ComponentFormattingOption.FullyDecoded)
# https://github.com/qutebrowser/qutebrowser/issues/727
if option == 'content.javascript.enabled' and value == 'false':
@@ -444,7 +442,7 @@ def _qute_settings_set(url: QUrl) -> _HandlerRet:
@add_handler('settings')
-def qute_settings(url: QUrl) -> _HandlerRet:
+def qute_settings(url: core.QUrl) -> _HandlerRet:
"""Handler for qute://settings. View/change qute configuration."""
global csrf_token
@@ -470,7 +468,7 @@ def qute_settings(url: QUrl) -> _HandlerRet:
@add_handler('bindings')
-def qute_bindings(_url: QUrl) -> _HandlerRet:
+def qute_bindings(_url: core.QUrl) -> _HandlerRet:
"""Handler for qute://bindings. View keybindings."""
bindings = {}
defaults = config.val.bindings.default
@@ -488,7 +486,7 @@ def qute_bindings(_url: QUrl) -> _HandlerRet:
@add_handler('back')
-def qute_back(url: QUrl) -> _HandlerRet:
+def qute_back(url: core.QUrl) -> _HandlerRet:
"""Handler for qute://back.
Simple page to free ram / lazy load a site, goes back on focusing the tab.
@@ -500,15 +498,15 @@ def qute_back(url: QUrl) -> _HandlerRet:
@add_handler('configdiff')
-def qute_configdiff(url: QUrl) -> _HandlerRet:
+def qute_configdiff(url: core.QUrl) -> _HandlerRet:
"""Handler for qute://configdiff."""
- include_hidden = QUrlQuery(url).queryItemValue('include_hidden') == 'true'
+ include_hidden = core.QUrlQuery(url).queryItemValue('include_hidden') == 'true'
dump = config.instance.dump_userconfig(include_hidden=include_hidden)
return 'text/plain', dump.encode('utf-8')
@add_handler('pastebin-version')
-def qute_pastebin_version(_url: QUrl) -> _HandlerRet:
+def qute_pastebin_version(_url: core.QUrl) -> _HandlerRet:
"""Handler that pastebins the version string."""
version.pastebin_version()
return 'text/plain', b'Paste called.'
@@ -521,14 +519,14 @@ def _pdf_path(filename: str) -> str:
@add_handler('pdfjs')
-def qute_pdfjs(url: QUrl) -> _HandlerRet:
+def qute_pdfjs(url: core.QUrl) -> _HandlerRet:
"""Handler for qute://pdfjs.
Return the pdf.js viewer or redirect to original URL if the file does not
exist.
"""
if url.path() == '/file':
- filename = QUrlQuery(url).queryItemValue('filename')
+ filename = core.QUrlQuery(url).queryItemValue('filename')
if not filename:
raise UrlInvalidError("Missing filename")
if '/' in filename or os.sep in filename:
@@ -542,7 +540,7 @@ def qute_pdfjs(url: QUrl) -> _HandlerRet:
return mimetype, data
if url.path() == '/web/viewer.html':
- query = QUrlQuery(url)
+ query = core.QUrlQuery(url)
filename = query.queryItemValue("filename")
if not filename:
raise UrlInvalidError("Missing filename")
@@ -552,7 +550,7 @@ def qute_pdfjs(url: QUrl) -> _HandlerRet:
source = query.queryItemValue('source')
if not source: # This may happen with old URLs stored in history
raise UrlInvalidError("Missing source")
- raise Redirect(QUrl(source))
+ raise Redirect(core.QUrl(source))
data = pdfjs.generate_pdfjs_page(filename, url)
return 'text/html', data
@@ -572,7 +570,7 @@ def qute_pdfjs(url: QUrl) -> _HandlerRet:
@add_handler('warning')
-def qute_warning(url: QUrl) -> _HandlerRet:
+def qute_warning(url: core.QUrl) -> _HandlerRet:
"""Handler for qute://warning."""
path = url.path()
if path == '/webkit':
@@ -592,7 +590,7 @@ def qute_warning(url: QUrl) -> _HandlerRet:
@add_handler('resource')
-def qute_resource(url: QUrl) -> _HandlerRet:
+def qute_resource(url: core.QUrl) -> _HandlerRet:
"""Handler for qute://resource."""
path = url.path().lstrip('/')
mimetype = utils.guess_mimetype(path, fallback=True)
@@ -604,7 +602,7 @@ def qute_resource(url: QUrl) -> _HandlerRet:
@add_handler('start')
-def qute_start(_url: QUrl) -> _HandlerRet:
+def qute_start(_url: core.QUrl) -> _HandlerRet:
"""Handler for qute://start."""
bookmarks = sorted(objreg.get('bookmark-manager').marks.items(),
key=lambda x: x[1]) # Sort by title
diff --git a/qutebrowser/browser/shared.py b/qutebrowser/browser/shared.py
index 779eb8197..b752eab4f 100644
--- a/qutebrowser/browser/shared.py
+++ b/qutebrowser/browser/shared.py
@@ -27,13 +27,12 @@ import netrc
import tempfile
from typing import Callable, Mapping, List, Optional, Iterable, Iterator
-from qutebrowser.qt.core import QUrl, pyqtBoundSignal
-
from qutebrowser.config import config
from qutebrowser.utils import (usertypes, message, log, objreg, jinja, utils,
qtutils, version)
from qutebrowser.mainwindow import mainwindow
from qutebrowser.misc import guiprocess, objects
+from qutebrowser.qt import core
class CallSuper(Exception):
@@ -72,7 +71,7 @@ def authentication_required(url, authenticator, abort_on):
else:
msg = '<b>{}</b> needs authentication'.format(
html.escape(url.toDisplayString()))
- urlstr = url.toString(QUrl.UrlFormattingOption.RemovePassword | QUrl.ComponentFormattingOption.FullyEncoded)
+ urlstr = url.toString(core.QUrl.UrlFormattingOption.RemovePassword | core.QUrl.ComponentFormattingOption.FullyEncoded)
answer = message.ask(title="Authentication required", text=msg,
mode=usertypes.PromptMode.user_pwd,
abort_on=abort_on, url=urlstr)
@@ -95,7 +94,7 @@ def javascript_confirm(url, js_msg, abort_on):
msg = 'From <b>{}</b>:<br/>{}'.format(html.escape(url.toDisplayString()),
_format_msg(js_msg))
- urlstr = url.toString(QUrl.UrlFormattingOption.RemovePassword | QUrl.ComponentFormattingOption.FullyEncoded)
+ urlstr = url.toString(core.QUrl.UrlFormattingOption.RemovePassword | core.QUrl.ComponentFormattingOption.FullyEncoded)
ans = message.ask('Javascript confirm', msg,
mode=usertypes.PromptMode.yesno,
abort_on=abort_on, url=urlstr)
@@ -112,7 +111,7 @@ def javascript_prompt(url, js_msg, default, abort_on):
msg = '<b>{}</b> asks:<br/>{}'.format(html.escape(url.toDisplayString()),
_format_msg(js_msg))
- urlstr = url.toString(QUrl.UrlFormattingOption.RemovePassword | QUrl.ComponentFormattingOption.FullyEncoded)
+ urlstr = url.toString(core.QUrl.UrlFormattingOption.RemovePassword | core.QUrl.ComponentFormattingOption.FullyEncoded)
answer = message.ask('Javascript prompt', msg,
mode=usertypes.PromptMode.text,
default=default,
@@ -135,7 +134,7 @@ def javascript_alert(url, js_msg, abort_on):
msg = 'From <b>{}</b>:<br/>{}'.format(html.escape(url.toDisplayString()),
_format_msg(js_msg))
- urlstr = url.toString(QUrl.UrlFormattingOption.RemovePassword | QUrl.ComponentFormattingOption.FullyEncoded)
+ urlstr = url.toString(core.QUrl.UrlFormattingOption.RemovePassword | core.QUrl.ComponentFormattingOption.FullyEncoded)
message.ask('Javascript alert', msg, mode=usertypes.PromptMode.alert,
abort_on=abort_on, url=urlstr)
@@ -160,10 +159,10 @@ def javascript_log_message(level, source, line, msg):
def handle_certificate_error(
*,
- request_url: QUrl,
- first_party_url: QUrl,
+ request_url: core.QUrl,
+ first_party_url: core.QUrl,
error: usertypes.AbstractCertificateErrorWrapper,
- abort_on: Iterable[pyqtBoundSignal],
+ abort_on: Iterable[core.pyqtBoundSignal],
) -> None:
"""Display a certificate error question.
@@ -184,7 +183,7 @@ def handle_certificate_error(
first_party_url.isValid() and
not request_url.matches(
first_party_url,
- QUrl.UrlFormattingOption.RemoveScheme)) # type: ignore[arg-type]
+ core.QUrl.UrlFormattingOption.RemoveScheme)) # type: ignore[arg-type]
if conf == 'ask' or conf == 'ask-block-thirdparty' and not is_resource:
err_template = jinja.environment.from_string("""
@@ -214,7 +213,7 @@ def handle_certificate_error(
error=error,
)
urlstr = request_url.toString(
- QUrl.UrlFormattingOption.RemovePassword | QUrl.ComponentFormattingOption.FullyEncoded) # type: ignore[arg-type]
+ core.QUrl.UrlFormattingOption.RemovePassword | core.QUrl.ComponentFormattingOption.FullyEncoded) # type: ignore[arg-type]
title = "Certificate error"
try:
@@ -275,7 +274,7 @@ def feature_permission(url, option, msg, yes_action, no_action, abort_on,
config_val = config.instance.get(option, url=url)
if config_val == 'ask':
if url.isValid():
- urlstr = url.toString(QUrl.UrlFormattingOption.RemovePassword | QUrl.ComponentFormattingOption.FullyEncoded)
+ urlstr = url.toString(core.QUrl.UrlFormattingOption.RemovePassword | core.QUrl.ComponentFormattingOption.FullyEncoded)
text = "Allow the website at <b>{}</b> to {}?".format(
html.escape(url.toDisplayString()), msg)
else:
diff --git a/qutebrowser/browser/signalfilter.py b/qutebrowser/browser/signalfilter.py
index beb91e70a..c673faa4a 100644
--- a/qutebrowser/browser/signalfilter.py
+++ b/qutebrowser/browser/signalfilter.py
@@ -21,12 +21,12 @@
import functools
-from qutebrowser.qt.core import QObject
+from qutebrowser.qt import core
from qutebrowser.utils import debug, log, objreg
-class SignalFilter(QObject):
+class SignalFilter(core.QObject):
"""A filter for signals.
diff --git a/qutebrowser/browser/urlmarks.py b/qutebrowser/browser/urlmarks.py
index 0d30f7973..42883fbd2 100644
--- a/qutebrowser/browser/urlmarks.py
+++ b/qutebrowser/browser/urlmarks.py
@@ -32,12 +32,11 @@ import functools
import collections
from typing import MutableMapping
-from qutebrowser.qt.core import pyqtSignal, QUrl, QObject
-
from qutebrowser.utils import (message, usertypes, qtutils, urlutils,
standarddir, objreg, log)
from qutebrowser.api import cmdutils
from qutebrowser.misc import lineparser
+from qutebrowser.qt import core
class Error(Exception):
@@ -60,7 +59,7 @@ class AlreadyExistsError(Error):
"""Exception emitted when a given URL does already exist."""
-class UrlMarkManager(QObject):
+class UrlMarkManager(core.QObject):
"""Base class for BookmarkManager and QuickmarkManager.
@@ -72,7 +71,7 @@ class UrlMarkManager(QObject):
changed: Emitted when anything changed.
"""
- changed = pyqtSignal()
+ changed = core.pyqtSignal()
_lineparser: lineparser.LineParser
@@ -151,7 +150,7 @@ class QuickmarkManager(UrlMarkManager):
if not url.isValid():
urlutils.invalid_url_error(url, "save quickmark")
return
- urlstr = url.toString(QUrl.UrlFormattingOption.RemovePassword | QUrl.ComponentFormattingOption.FullyEncoded)
+ urlstr = url.toString(core.QUrl.UrlFormattingOption.RemovePassword | core.QUrl.ComponentFormattingOption.FullyEncoded)
message.ask_async(
"Add quickmark:", usertypes.PromptMode.text,
functools.partial(self.quickmark_add, urlstr),
@@ -198,7 +197,7 @@ class QuickmarkManager(UrlMarkManager):
Use a name instead where possible.
"""
qtutils.ensure_valid(url)
- urlstr = url.toString(QUrl.UrlFormattingOption.RemovePassword | QUrl.ComponentFormattingOption.FullyEncoded)
+ urlstr = url.toString(core.QUrl.UrlFormattingOption.RemovePassword | core.QUrl.ComponentFormattingOption.FullyEncoded)
try:
index = list(self.marks.values()).index(urlstr)
@@ -270,7 +269,7 @@ class BookmarkManager(UrlMarkManager):
errstr = urlutils.get_errstring(url)
raise InvalidUrlError(errstr)
- urlstr = url.toString(QUrl.UrlFormattingOption.RemovePassword | QUrl.ComponentFormattingOption.FullyEncoded)
+ urlstr = url.toString(core.QUrl.UrlFormattingOption.RemovePassword | core.QUrl.ComponentFormattingOption.FullyEncoded)
if urlstr in self.marks:
if toggle:
diff --git a/qutebrowser/browser/webelem.py b/qutebrowser/browser/webelem.py
index a734f15b8..7192b758e 100644
--- a/qutebrowser/browser/webelem.py
+++ b/qutebrowser/browser/webelem.py
@@ -21,13 +21,12 @@
from typing import Iterator, Optional, Set, TYPE_CHECKING, Union, Dict
import collections.abc
-
-from qutebrowser.qt.core import QUrl, Qt, QEvent, QTimer, QRect, QPointF
-from qutebrowser.qt.gui import QMouseEvent
+from qutebrowser.qt import gui
from qutebrowser.config import config
from qutebrowser.keyinput import modeman
from qutebrowser.utils import log, usertypes, utils, qtutils, objreg
+from qutebrowser.qt import core
if TYPE_CHECKING:
from qutebrowser.browser import browsertab
@@ -46,7 +45,7 @@ class OrphanedError(Error):
"""Raised when a webelement's parent has vanished."""
-def css_selector(group: str, url: QUrl) -> str:
+def css_selector(group: str, url: core.QUrl) -> str:
"""Get a CSS selector for the given group/URL."""
selectors = config.instance.get('hints.selectors', url)
if group not in selectors:
@@ -98,7 +97,7 @@ class AbstractWebElement(collections.abc.MutableMapping): # type: ignore[type-a
"""Check if this element has a valid frame attached."""
raise NotImplementedError
- def geometry(self) -> QRect:
+ def geometry(self) -> core.QRect:
"""Get the geometry for this element."""
raise NotImplementedError
@@ -144,8 +143,8 @@ class AbstractWebElement(collections.abc.MutableMapping): # type: ignore[type-a
"""Insert the given text into the element."""
raise NotImplementedError
- def rect_on_view(self, *, elem_geometry: QRect = None,
- no_js: bool = False) -> QRect:
+ def rect_on_view(self, *, elem_geometry: core.QRect = None,
+ no_js: bool = False) -> core.QRect:
"""Get the geometry of the element relative to the webview.
Args:
@@ -281,7 +280,7 @@ class AbstractWebElement(collections.abc.MutableMapping): # type: ignore[type-a
"""Remove target from link."""
raise NotImplementedError
- def resolve_url(self, baseurl: QUrl) -> Optional[QUrl]:
+ def resolve_url(self, baseurl: core.QUrl) -> Optional[core.QUrl]:
"""Resolve the URL in the element's src/href attribute.
Args:
@@ -300,7 +299,7 @@ class AbstractWebElement(collections.abc.MutableMapping): # type: ignore[type-a
else:
return None
- url = QUrl(text)
+ url = core.QUrl(text)
if not url.isValid():
return None
if url.isRelative():
@@ -317,7 +316,7 @@ class AbstractWebElement(collections.abc.MutableMapping): # type: ignore[type-a
"""Return True if clicking this element needs user interaction."""
raise NotImplementedError
- def _mouse_pos(self) -> QPointF:
+ def _mouse_pos(self) -> core.QPointF:
"""Get the position to click/hover."""
# Click the center of the largest square fitting into the top/left
# corner of the rectangle, this will help if part of the <a> element
@@ -331,43 +330,43 @@ class AbstractWebElement(collections.abc.MutableMapping): # type: ignore[type-a
pos = rect.center()
if pos.x() < 0 or pos.y() < 0:
raise Error("Element position is out of view!")
- return QPointF(pos)
+ return core.QPointF(pos)
def _move_text_cursor(self) -> None:
"""Move cursor to end after clicking."""
raise NotImplementedError
def _click_fake_event(self, click_target: usertypes.ClickTarget,
- button: Qt.MouseButton = Qt.MouseButton.LeftButton) -> None:
+ button: core.Qt.MouseButton = core.Qt.MouseButton.LeftButton) -> None:
"""Send a fake click event to the element."""
pos = self._mouse_pos()
log.webelem.debug("Sending fake click to {!r} at position {} with "
"target {}".format(self, pos, click_target))
- target_modifiers: Dict[usertypes.ClickTarget, Qt.KeyboardModifier] = {
- usertypes.ClickTarget.normal: Qt.KeyboardModifier.NoModifier,
- usertypes.ClickTarget.window: Qt.KeyboardModifier.AltModifier | Qt.KeyboardModifier.ShiftModifier,
- usertypes.ClickTarget.tab: Qt.KeyboardModifier.ControlModifier,
- usertypes.ClickTarget.tab_bg: Qt.KeyboardModifier.ControlModifier,
+ target_modifiers: Dict[usertypes.ClickTarget, core.Qt.KeyboardModifier] = {
+ usertypes.ClickTarget.normal: core.Qt.KeyboardModifier.NoModifier,
+ usertypes.ClickTarget.window: core.Qt.KeyboardModifier.AltModifier | core.Qt.KeyboardModifier.ShiftModifier,
+ usertypes.ClickTarget.tab: core.Qt.KeyboardModifier.ControlModifier,
+ usertypes.ClickTarget.tab_bg: core.Qt.KeyboardModifier.ControlModifier,
}
if config.val.tabs.background:
- target_modifiers[usertypes.ClickTarget.tab] |= Qt.KeyboardModifier.ShiftModifier
+ target_modifiers[usertypes.ClickTarget.tab] |= core.Qt.KeyboardModifier.ShiftModifier
else:
- target_modifiers[usertypes.ClickTarget.tab_bg] |= Qt.KeyboardModifier.ShiftModifier
+ target_modifiers[usertypes.ClickTarget.tab_bg] |= core.Qt.KeyboardModifier.ShiftModifier
modifiers = target_modifiers[click_target]
events = [
- QMouseEvent(QEvent.Type.MouseMove, pos, Qt.MouseButton.NoButton, Qt.MouseButton.NoButton, Qt.KeyboardModifier.NoModifier),
- QMouseEvent(QEvent.Type.MouseButtonPress, pos, button, button, modifiers),
- QMouseEvent(QEvent.Type.MouseButtonRelease, pos, button, Qt.MouseButton.NoButton, modifiers),
+ gui.QMouseEvent(core.QEvent.Type.MouseMove, pos, core.Qt.MouseButton.NoButton, core.Qt.MouseButton.NoButton, core.Qt.KeyboardModifier.NoModifier),
+ gui.QMouseEvent(core.QEvent.Type.MouseButtonPress, pos, button, button, modifiers),
+ gui.QMouseEvent(core.QEvent.Type.MouseButtonRelease, pos, button, core.Qt.MouseButton.NoButton, modifiers),
]
for evt in events:
self._tab.send_event(evt)
- QTimer.singleShot(0, self._move_text_cursor)
+ core.QTimer.singleShot(0, self._move_text_cursor)
def _click_editable(self, click_target: usertypes.ClickTarget) -> None:
"""Fake a click on an editable input field."""
@@ -445,11 +444,11 @@ class AbstractWebElement(collections.abc.MutableMapping): # type: ignore[type-a
def hover(self) -> None:
"""Simulate a mouse hover over the element."""
pos = self._mouse_pos()
- event = QMouseEvent(QEvent.Type.MouseMove, pos, Qt.MouseButton.NoButton, Qt.MouseButton.NoButton,
- Qt.KeyboardModifier.NoModifier)
+ event = gui.QMouseEvent(core.QEvent.Type.MouseMove, pos, core.Qt.MouseButton.NoButton, core.Qt.MouseButton.NoButton,
+ core.Qt.KeyboardModifier.NoModifier)
self._tab.send_event(event)
def right_click(self) -> None:
"""Simulate a right-click on the element."""
self._click_fake_event(usertypes.ClickTarget.normal,
- button=Qt.MouseButton.RightButton)
+ button=core.Qt.MouseButton.RightButton)
diff --git a/qutebrowser/browser/webengine/certificateerror.py b/qutebrowser/browser/webengine/certificateerror.py
index 7ee69640f..45fab52a9 100644
--- a/qutebrowser/browser/webengine/certificateerror.py
+++ b/qutebrowser/browser/webengine/certificateerror.py
@@ -21,9 +21,7 @@
from typing import Any
-from qutebrowser.qt import machinery
-from qutebrowser.qt.core import QUrl
-from qutebrowser.qt.webenginecore import QWebEngineCertificateError
+from qutebrowser.qt import webenginecore, core, machinery
from qutebrowser.utils import usertypes, utils, debug
@@ -35,7 +33,7 @@ class CertificateErrorWrapper(usertypes.AbstractCertificateErrorWrapper):
Base code shared between Qt 5 and 6 implementations.
"""
- def __init__(self, error: QWebEngineCertificateError) -> None:
+ def __init__(self, error: webenginecore.QWebEngineCertificateError) -> None:
super().__init__()
self._error = error
self.ignore = False
@@ -53,10 +51,10 @@ class CertificateErrorWrapper(usertypes.AbstractCertificateErrorWrapper):
def __repr__(self) -> str:
return utils.get_repr(
self,
- error=debug.qenum_key(QWebEngineCertificateError, self._type()),
+ error=debug.qenum_key(webenginecore.QWebEngineCertificateError, self._type()),
string=str(self))
- def url(self) -> QUrl:
+ def url(self) -> core.QUrl:
return self._error.url()
def is_overridable(self) -> bool:
@@ -112,7 +110,7 @@ class CertificateErrorWrapperQt6(CertificateErrorWrapper):
self._error.acceptCertificate()
-def create(error: QWebEngineCertificateError) -> CertificateErrorWrapper:
+def create(error: webenginecore.QWebEngineCertificateError) -> CertificateErrorWrapper:
"""Factory function picking the right class based on Qt version."""
if machinery.IS_QT5:
return CertificateErrorWrapperQt5(error)
diff --git a/qutebrowser/browser/webengine/interceptor.py b/qutebrowser/browser/webengine/interceptor.py
index a3370a599..419026fbb 100644
--- a/qutebrowser/browser/webengine/interceptor.py
+++ b/qutebrowser/browser/webengine/interceptor.py
@@ -19,29 +19,26 @@
"""A request interceptor taking care of adblocking and custom headers."""
-from qutebrowser.qt.core import QUrl, QByteArray
-from qutebrowser.qt.webenginecore import (QWebEngineUrlRequestInterceptor,
- QWebEngineUrlRequestInfo)
-
from qutebrowser.config import websettings, config
from qutebrowser.browser import shared
from qutebrowser.utils import debug, log
from qutebrowser.extensions import interceptors
from qutebrowser.misc import objects
+from qutebrowser.qt import webenginecore, core
class WebEngineRequest(interceptors.Request):
"""QtWebEngine-specific request interceptor functionality."""
- _WHITELISTED_REQUEST_METHODS = {QByteArray(b'GET'), QByteArray(b'HEAD')}
+ _WHITELISTED_REQUEST_METHODS = {core.QByteArray(b'GET'), core.QByteArray(b'HEAD')}
def __init__(self, *args, webengine_info, **kwargs):
super().__init__(*args, **kwargs)
self._webengine_info = webengine_info
self._redirected = False
- def redirect(self, url: QUrl, *, ignore_unsupported: bool = False) -> None:
+ def redirect(self, url: core.QUrl, *, ignore_unsupported: bool = False) -> None:
if self._redirected:
raise interceptors.RedirectException("Request already redirected.")
if self._webengine_info is None:
@@ -62,7 +59,7 @@ class WebEngineRequest(interceptors.Request):
self._redirected = True
-class RequestInterceptor(QWebEngineUrlRequestInterceptor):
+class RequestInterceptor(webenginecore.QWebEngineUrlRequestInterceptor):
"""Handle ad blocking and custom headers."""
def __init__(self, parent=None):
@@ -71,47 +68,47 @@ class RequestInterceptor(QWebEngineUrlRequestInterceptor):
# extension ResourceTypes. If a ResourceType is added to Qt, this table
# should be updated too.
self._resource_types = {
- QWebEngineUrlRequestInfo.ResourceType.ResourceTypeMainFrame:
+ webenginecore.QWebEngineUrlRequestInfo.ResourceType.ResourceTypeMainFrame:
interceptors.ResourceType.main_frame,
- QWebEngineUrlRequestInfo.ResourceType.ResourceTypeSubFrame:
+ webenginecore.QWebEngineUrlRequestInfo.ResourceType.ResourceTypeSubFrame:
interceptors.ResourceType.sub_frame,
- QWebEngineUrlRequestInfo.ResourceType.ResourceTypeStylesheet:
+ webenginecore.QWebEngineUrlRequestInfo.ResourceType.ResourceTypeStylesheet:
interceptors.ResourceType.stylesheet,
- QWebEngineUrlRequestInfo.ResourceType.ResourceTypeScript:
+ webenginecore.QWebEngineUrlRequestInfo.ResourceType.ResourceTypeScript:
interceptors.ResourceType.script,
- QWebEngineUrlRequestInfo.ResourceType.ResourceTypeImage:
+ webenginecore.QWebEngineUrlRequestInfo.ResourceType.ResourceTypeImage:
interceptors.ResourceType.image,
- QWebEngineUrlRequestInfo.ResourceType.ResourceTypeFontResource:
+ webenginecore.QWebEngineUrlRequestInfo.ResourceType.ResourceTypeFontResource:
interceptors.ResourceType.font_resource,
- QWebEngineUrlRequestInfo.ResourceType.ResourceTypeSubResource:
+ webenginecore.QWebEngineUrlRequestInfo.ResourceType.ResourceTypeSubResource:
interceptors.ResourceType.sub_resource,
- QWebEngineUrlRequestInfo.ResourceType.ResourceTypeObject:
+ webenginecore.QWebEngineUrlRequestInfo.ResourceType.ResourceTypeObject:
interceptors.ResourceType.object,
- QWebEngineUrlRequestInfo.ResourceType.ResourceTypeMedia:
+ webenginecore.QWebEngineUrlRequestInfo.ResourceType.ResourceTypeMedia:
interceptors.ResourceType.media,
- QWebEngineUrlRequestInfo.ResourceType.ResourceTypeWorker:
+ webenginecore.QWebEngineUrlRequestInfo.ResourceType.ResourceTypeWorker:
interceptors.ResourceType.worker,
- QWebEngineUrlRequestInfo.ResourceType.ResourceTypeSharedWorker:
+ webenginecore.QWebEngineUrlRequestInfo.ResourceType.ResourceTypeSharedWorker:
interceptors.ResourceType.shared_worker,
- QWebEngineUrlRequestInfo.ResourceType.ResourceTypePrefetch:
+ webenginecore.QWebEngineUrlRequestInfo.ResourceType.ResourceTypePrefetch:
interceptors.ResourceType.prefetch,
- QWebEngineUrlRequestInfo.ResourceType.ResourceTypeFavicon:
+ webenginecore.QWebEngineUrlRequestInfo.ResourceType.ResourceTypeFavicon:
interceptors.ResourceType.favicon,
- QWebEngineUrlRequestInfo.ResourceType.ResourceTypeXhr:
+ webenginecore.QWebEngineUrlRequestInfo.ResourceType.ResourceTypeXhr:
interceptors.ResourceType.xhr,
- QWebEngineUrlRequestInfo.ResourceType.ResourceTypePing:
+ webenginecore.QWebEngineUrlRequestInfo.ResourceType.ResourceTypePing:
interceptors.ResourceType.ping,
- QWebEngineUrlRequestInfo.ResourceType.ResourceTypeServiceWorker:
+ webenginecore.QWebEngineUrlRequestInfo.ResourceType.ResourceTypeServiceWorker:
interceptors.ResourceType.service_worker,
- QWebEngineUrlRequestInfo.ResourceType.ResourceTypeCspReport:
+ webenginecore.QWebEngineUrlRequestInfo.ResourceType.ResourceTypeCspReport:
interceptors.ResourceType.csp_report,
- QWebEngineUrlRequestInfo.ResourceType.ResourceTypePluginResource:
+ webenginecore.QWebEngineUrlRequestInfo.ResourceType.ResourceTypePluginResource:
interceptors.ResourceType.plugin_resource,
- QWebEngineUrlRequestInfo.ResourceType.ResourceTypeUnknown:
+ webenginecore.QWebEngineUrlRequestInfo.ResourceType.ResourceTypeUnknown:
interceptors.ResourceType.unknown,
- QWebEngineUrlRequestInfo.ResourceType.ResourceTypeNavigationPreloadMainFrame:
+ webenginecore.QWebEngineUrlRequestInfo.ResourceType.ResourceTypeNavigationPreloadMainFrame:
interceptors.ResourceType.preload_main_frame,
- QWebEngineUrlRequestInfo.ResourceType.ResourceTypeNavigationPreloadSubFrame:
+ webenginecore.QWebEngineUrlRequestInfo.ResourceType.ResourceTypeNavigationPreloadSubFrame:
interceptors.ResourceType.preload_sub_frame,
}
@@ -132,9 +129,9 @@ class RequestInterceptor(QWebEngineUrlRequestInterceptor):
info: QWebEngineUrlRequestInfo &info
"""
if 'log-requests' in objects.debug_flags:
- resource_type_str = debug.qenum_key(QWebEngineUrlRequestInfo,
+ resource_type_str = debug.qenum_key(webenginecore.QWebEngineUrlRequestInfo,
info.resourceType())
- navigation_type_str = debug.qenum_key(QWebEngineUrlRequestInfo,
+ navigation_type_str = debug.qenum_key(webenginecore.QWebEngineUrlRequestInfo,
info.navigationType())
log.network.debug("{} {}, first-party {}, resource {}, "
"navigation {}".format(
@@ -157,15 +154,15 @@ class RequestInterceptor(QWebEngineUrlRequestInterceptor):
except KeyError:
log.network.warning(
"Resource type {} not found in RequestInterceptor dict."
- .format(debug.qenum_key(QWebEngineUrlRequestInfo,
+ .format(debug.qenum_key(webenginecore.QWebEngineUrlRequestInfo,
info.resourceType())))
resource_type = interceptors.ResourceType.unknown
- is_xhr = info.resourceType() == QWebEngineUrlRequestInfo.ResourceType.ResourceTypeXhr
+ is_xhr = info.resourceType() == webenginecore.QWebEngineUrlRequestInfo.ResourceType.ResourceTypeXhr
if ((url.scheme(), url.host(), url.path()) ==
('qute', 'settings', '/set')):
- if first_party != QUrl('qute://settings/') or not is_xhr:
+ if first_party != core.QUrl('qute://settings/') or not is_xhr:
log.network.warning("Blocking malicious request from {} to {}"
.format(first_party.toDisplayString(),
url.toDisplayString()))
diff --git a/qutebrowser/browser/webengine/notification.py b/qutebrowser/browser/webengine/notification.py
index 88f889da3..55dcbff37 100644
--- a/qutebrowser/browser/webengine/notification.py
+++ b/qutebrowser/browser/webengine/notification.py
@@ -49,26 +49,20 @@ import itertools
import functools
import subprocess
from typing import Any, List, Dict, Optional, Iterator, Type, TYPE_CHECKING
-
-from qutebrowser.qt.core import (Qt, QObject, QVariant, QMetaType, QByteArray, pyqtSlot,
- pyqtSignal, QTimer, QProcess, QUrl)
-from qutebrowser.qt.gui import QImage, QIcon, QPixmap
-from qutebrowser.qt.dbus import (QDBusConnection, QDBusInterface, QDBus, QDBusServiceWatcher,
- QDBusArgument, QDBusMessage, QDBusError)
-from qutebrowser.qt.widgets import QSystemTrayIcon
+from qutebrowser.qt import widgets
if TYPE_CHECKING:
# putting these behind TYPE_CHECKING also means this module is importable
# on installs that don't have these
- from qutebrowser.qt.webenginecore import QWebEngineNotification
- from qutebrowser.qt.webenginewidgets import QWebEngineProfile
+ from qutebrowser.qt import webenginewidgets, webenginecore, QWebEngineNotification
+ from qutebrowser.qt import QWebEngineProfile
from qutebrowser.config import config
from qutebrowser.misc import objects
from qutebrowser.utils import (
qtutils, log, utils, debug, message, objreg, resources,
)
-from qutebrowser.qt import sip
+from qutebrowser.qt import gui, dbus, core, sip
bridge: Optional['NotificationBridgePresenter'] = None
@@ -126,8 +120,8 @@ class DBusError(Error):
"org.freedesktop.DBus.Error.NameHasNoOwner",
}
- def __init__(self, msg: QDBusMessage) -> None:
- assert msg.type() == QDBusMessage.MessageType.ErrorMessage
+ def __init__(self, msg: dbus.QDBusMessage) -> None:
+ assert msg.type() == dbus.QDBusMessage.MessageType.ErrorMessage
self.error = msg.errorName()
self.error_message = msg.errorMessage()
self.is_fatal = self.error not in self._NON_FATAL_ERRORS
@@ -135,7 +129,7 @@ class DBusError(Error):
super().__init__(text)
-class AbstractNotificationAdapter(QObject):
+class AbstractNotificationAdapter(core.QObject):
"""An adapter taking notifications and displaying them.
@@ -148,14 +142,14 @@ class AbstractNotificationAdapter(QObject):
# Emitted by the adapter when the notification with the given ID was closed or
# clicked by the user.
- close_id = pyqtSignal(int)
- click_id = pyqtSignal(int)
+ close_id = core.pyqtSignal(int)
+ click_id = core.pyqtSignal(int)
# Emitted by the adapter when an error occurred, which should result in the adapter
# getting swapped out (potentially initializing the same adapter again, or using a
# different one if that fails).
- error = pyqtSignal(str)
- clear_all = pyqtSignal()
+ error = core.pyqtSignal(str)
+ clear_all = core.pyqtSignal()
def present(
self,
@@ -173,7 +167,7 @@ class AbstractNotificationAdapter(QObject):
"""
raise NotImplementedError
- def _should_include_origin(self, origin: QUrl) -> bool:
+ def _should_include_origin(self, origin: core.QUrl) -> bool:
"""Check if the origin is useful to include.
If we open the page via a file scheme, the origin is QUrl('file:///') which
@@ -184,13 +178,13 @@ class AbstractNotificationAdapter(QObject):
config.instance.get('content.notifications.show_origin', url=origin),
)
- @pyqtSlot(int)
+ @core.pyqtSlot(int)
def on_web_closed(self, notification_id: int) -> None:
"""Called when a notification was closed by the website."""
raise NotImplementedError
-class NotificationBridgePresenter(QObject):
+class NotificationBridgePresenter(core.QObject):
"""Notification presenter which bridges notifications to an adapter.
@@ -200,7 +194,7 @@ class NotificationBridgePresenter(QObject):
- Switching out adapters if the current one emitted its error signal.
"""
- def __init__(self, parent: QObject = None) -> None:
+ def __init__(self, parent: core.QObject = None) -> None:
super().__init__(parent)
self._active_notifications: Dict[int, 'QWebEngineNotification'] = {}
@@ -326,7 +320,7 @@ class NotificationBridgePresenter(QObject):
log.misc.debug("Did not find match")
return None
- @pyqtSlot(int)
+ @core.pyqtSlot(int)
def _on_adapter_closed(self, notification_id: int) -> None:
"""A notification was closed by the adapter (usually due to the user).
@@ -344,7 +338,7 @@ class NotificationBridgePresenter(QObject):
notification.close()
- @pyqtSlot(int)
+ @core.pyqtSlot(int)
def _on_adapter_clicked(self, notification_id: int) -> None:
"""A notification was clicked by the adapter (usually due to the user).
@@ -367,7 +361,7 @@ class NotificationBridgePresenter(QObject):
for win_id in objreg.window_registry:
tabbedbrowser = objreg.get("tabbed-browser", window=win_id, scope="window")
for idx, tab in enumerate(tabbedbrowser.widgets()):
- if tab.url().matches(notification.origin(), QUrl.UrlFormattingOption.RemovePath):
+ if tab.url().matches(notification.origin(), core.QUrl.UrlFormattingOption.RemovePath):
tabbedbrowser.widget.setCurrentIndex(idx)
return
log.misc.debug(f"No matching tab found for {notification.origin()}")
@@ -385,7 +379,7 @@ class NotificationBridgePresenter(QObject):
self._adapter = None
self._on_adapter_clear_all()
- @pyqtSlot()
+ @core.pyqtSlot()
def _on_adapter_clear_all(self) -> None:
"""Called when the adapter requests clearing all notifications.
@@ -399,7 +393,7 @@ class NotificationBridgePresenter(QObject):
for notification_id in list(self._active_notifications):
self._on_adapter_closed(notification_id)
- @pyqtSlot(str)
+ @core.pyqtSlot(str)
def _on_adapter_error(self, error: str) -> None:
"""A fatal error happened in the adapter.
@@ -430,14 +424,14 @@ class SystrayNotificationAdapter(AbstractNotificationAdapter):
NAME = "systray"
NOTIFICATION_ID = 1 # only one concurrent notification supported
- def __init__(self, parent: QObject = None) -> None:
+ def __init__(self, parent: core.QObject = None) -> None:
super().__init__(parent)
- if not QSystemTrayIcon.isSystemTrayAvailable():
+ if not widgets.QSystemTrayIcon.isSystemTrayAvailable():
raise Error("No system tray available")
- if not QSystemTrayIcon.supportsMessages():
+ if not widgets.QSystemTrayIcon.supportsMessages():
raise Error("System tray does not support messages")
- self._systray = QSystemTrayIcon(self)
+ self._systray = widgets.QSystemTrayIcon(self)
self._systray.setIcon(objects.qapp.windowIcon())
self._systray.messageClicked.connect(self._on_systray_clicked)
@@ -458,27 +452,27 @@ class SystrayNotificationAdapter(AbstractNotificationAdapter):
return self.NOTIFICATION_ID
- def _convert_icon(self, image: QImage) -> QIcon:
+ def _convert_icon(self, image: gui.QImage) -> gui.QIcon:
"""Convert a QImage to a QIcon."""
if image.isNull():
- return QIcon()
- pixmap = QPixmap.fromImage(image, Qt.ImageConversionFlag.NoFormatConversion)
+ return gui.QIcon()
+ pixmap = gui.QPixmap.fromImage(image, core.Qt.ImageConversionFlag.NoFormatConversion)
assert not pixmap.isNull()
- icon = QIcon(pixmap)
+ icon = gui.QIcon(pixmap)
assert not icon.isNull()
return icon
- def _format_message(self, text: str, origin: QUrl) -> str:
+ def _format_message(self, text: str, origin: core.QUrl) -> str:
"""Format the message to display."""
if not self._should_include_origin(origin):
return text
return origin.toDisplayString() + '\n\n' + text
- @pyqtSlot()
+ @core.pyqtSlot()
def _on_systray_clicked(self) -> None:
self.click_id.emit(self.NOTIFICATION_ID)
- @pyqtSlot(int)
+ @core.pyqtSlot(int)
def on_web_closed(self, notification_id: int) -> None:
assert notification_id == self.NOTIFICATION_ID, notification_id
if not sip.isdeleted(self._systray):
@@ -499,7 +493,7 @@ class MessagesNotificationAdapter(AbstractNotificationAdapter):
NAME = "messages"
- def __init__(self, parent: QObject = None) -> None:
+ def __init__(self, parent: core.QObject = None) -> None:
super().__init__(parent)
self._id_gen = itertools.count(1)
@@ -515,12 +509,12 @@ class MessagesNotificationAdapter(AbstractNotificationAdapter):
message.info(markup, replace=f'notifications-{new_id}', rich=True)
# Faking closing, timing might not be 100% accurate
- QTimer.singleShot(
+ core.QTimer.singleShot(
config.val.messages.timeout, lambda: self.close_id.emit(new_id))
return new_id
- @pyqtSlot(int)
+ @core.pyqtSlot(int)
def on_web_closed(self, _notification_id: int) -> None:
"""We can't close messages."""
@@ -551,7 +545,7 @@ class HerbeNotificationAdapter(AbstractNotificationAdapter):
NAME = "herbe"
- def __init__(self, parent: QObject = None) -> None:
+ def __init__(self, parent: core.QObject = None) -> None:
super().__init__(parent)
# Also cleans up potentially hanging semaphores from herbe.
# https://github.com/dudik/herbe#notifications-dont-show-up
@@ -572,7 +566,7 @@ class HerbeNotificationAdapter(AbstractNotificationAdapter):
if replaces_id is not None:
self.on_web_closed(replaces_id)
- proc = QProcess(self)
+ proc = core.QProcess(self)
proc.errorOccurred.connect(self._on_error)
lines = list(self._message_lines(qt_notification))
@@ -600,7 +594,7 @@ class HerbeNotificationAdapter(AbstractNotificationAdapter):
if not qt_notification.icon().isNull():
yield "(icon not shown)"
- def _on_finished(self, pid: int, code: int, status: QProcess.ExitStatus) -> None:
+ def _on_finished(self, pid: int, code: int, status: core.QProcess.ExitStatus) -> None:
"""Handle a closing herbe process.
From the GitHub page:
@@ -613,7 +607,7 @@ class HerbeNotificationAdapter(AbstractNotificationAdapter):
signals, we can't do much - emitting self.error would just go use herbe again,
so there's no point.
"""
- if status == QProcess.ExitStatus.CrashExit:
+ if status == core.QProcess.ExitStatus.CrashExit:
pass
elif code == 0:
self.click_id.emit(pid)
@@ -621,20 +615,20 @@ class HerbeNotificationAdapter(AbstractNotificationAdapter):
pass
else:
proc = self.sender()
- assert isinstance(proc, QProcess), proc
+ assert isinstance(proc, core.QProcess), proc
stderr = proc.readAllStandardError()
raise Error(f'herbe exited with status {code}: {stderr}')
self.close_id.emit(pid)
- @pyqtSlot(QProcess.ProcessError)
- def _on_error(self, error: QProcess.ProcessError) -> None:
- if error == QProcess.ProcessError.Crashed:
+ @core.pyqtSlot(core.QProcess.ProcessError)
+ def _on_error(self, error: core.QProcess.ProcessError) -> None:
+ if error == core.QProcess.ProcessError.Crashed:
return
- name = debug.qenum_key(QProcess.ProcessError, error)
+ name = debug.qenum_key(core.QProcess.ProcessError, error)
raise Error(f'herbe process error: {name}')
- @pyqtSlot(int)
+ @core.pyqtSlot(int)
def on_web_closed(self, notification_id: int) -> None:
"""Handle closing the notification from JS.
@@ -682,16 +676,16 @@ class _ServerCapabilities:
)
-def _as_uint32(x: int) -> QVariant:
+def _as_uint32(x: int) -> core.QVariant:
"""Convert the given int to an uint32 for DBus."""
- variant = QVariant(x)
+ variant = core.QVariant(x)
try:
# Qt 5
- target_type = QVariant.Type.UInt
+ target_type = core.QVariant.Type.UInt
except AttributeError:
# Qt 6
- target_type = QMetaType(QMetaType.Type.UInt.value)
+ target_type = core.QMetaType(core.QMetaType.Type.UInt.value)
successful = variant.convert(target_type)
assert successful
@@ -717,7 +711,7 @@ class DBusNotificationAdapter(AbstractNotificationAdapter):
SPEC_VERSION = "1.2" # Released in January 2011, still current in March 2021.
NAME = "libnotify"
- def __init__(self, parent: QObject = None) -> None:
+ def __init__(self, parent: core.QObject = None) -> None:
super().__init__(parent)
if utils.is_windows:
@@ -727,16 +721,16 @@ class DBusNotificationAdapter(AbstractNotificationAdapter):
# possible to run DBus there.
raise Error("libnotify is not supported on Windows")
- bus = QDBusConnection.sessionBus()
+ bus = dbus.QDBusConnection.sessionBus()
if not bus.isConnected():
raise Error(
"Failed to connect to DBus session bus: " +
self._dbus_error_str(bus.lastError()))
- self._watcher = QDBusServiceWatcher(
+ self._watcher = dbus.QDBusServiceWatcher(
self.SERVICE,
bus,
- QDBusServiceWatcher.WatchModeFlag.WatchForUnregistration,
+ dbus.QDBusServiceWatcher.WatchModeFlag.WatchForUnregistration,
self,
)
self._watcher.serviceUnregistered.connect(self._on_service_unregistered)
@@ -744,7 +738,7 @@ class DBusNotificationAdapter(AbstractNotificationAdapter):
test_service = 'test-notification-service' in objects.debug_flags
service = f"{self.TEST_SERVICE}{os.getpid()}" if test_service else self.SERVICE
- self.interface = QDBusInterface(service, self.PATH, self.INTERFACE, bus)
+ self.interface = dbus.QDBusInterface(service, self.PATH, self.INTERFACE, bus)
if not self.interface.isValid():
raise Error(
"Could not construct a DBus interface: " +
@@ -771,7 +765,7 @@ class DBusNotificationAdapter(AbstractNotificationAdapter):
else:
self._fetch_capabilities()
- @pyqtSlot(str)
+ @core.pyqtSlot(str)
def _on_service_unregistered(self) -> None:
"""Make sure we know when the notification daemon exits.
@@ -858,8 +852,8 @@ class DBusNotificationAdapter(AbstractNotificationAdapter):
def _get_server_info(self) -> None:
"""Query notification server information and set quirks."""
- reply = self.interface.call(QDBus.CallMode.BlockWithGui, "GetServerInformation")
- self._verify_message(reply, "ssss", QDBusMessage.MessageType.ReplyMessage)
+ reply = self.interface.call(dbus.QDBus.CallMode.BlockWithGui, "GetServerInformation")
+ self._verify_message(reply, "ssss", dbus.QDBusMessage.MessageType.ReplyMessage)
name, vendor, ver, spec_version = reply.arguments()
log.misc.debug(
@@ -886,7 +880,7 @@ class DBusNotificationAdapter(AbstractNotificationAdapter):
if spec_version in icon_key_overrides:
self._quirks.icon_key = icon_key_overrides[spec_version]
- def _dbus_error_str(self, error: QDBusError) -> str:
+ def _dbus_error_str(self, error: dbus.QDBusError) -> str:
"""Get a string for a DBus error."""
if not error.isValid():
return "Unknown error"
@@ -894,20 +888,20 @@ class DBusNotificationAdapter(AbstractNotificationAdapter):
def _verify_message(
self,
- msg: QDBusMessage,
+ msg: dbus.QDBusMessage,
expected_signature: str,
- expected_type: QDBusMessage.MessageType,
+ expected_type: dbus.QDBusMessage.MessageType,
) -> None:
"""Check the signature/type of a received message.
Raises DBusError if the signature doesn't match.
"""
assert expected_type not in [
- QDBusMessage.MessageType.ErrorMessage,
- QDBusMessage.MessageType.InvalidMessage,
+ dbus.QDBusMessage.MessageType.ErrorMessage,
+ dbus.QDBusMessage.MessageType.InvalidMessage,
], expected_type
- if msg.type() == QDBusMessage.MessageType.ErrorMessage:
+ if msg.type() == dbus.QDBusMessage.MessageType.ErrorMessage:
raise DBusError(msg)
signature = msg.signature()
@@ -918,8 +912,8 @@ class DBusNotificationAdapter(AbstractNotificationAdapter):
typ = msg.type()
if typ != expected_type:
- type_str = debug.qenum_key(QDBusMessage.MessageType, typ)
- expected_type_str = debug.qenum_key(QDBusMessage.MessageType, expected_type)
+ type_str = debug.qenum_key(dbus.QDBusMessage.MessageType, typ)
+ expected_type_str = debug.qenum_key(dbus.QDBusMessage.MessageType, expected_type)
raise Error(
f"Got a message of type {type_str} but expected {expected_type_str}"
f"(args: {msg.arguments()})")
@@ -950,17 +944,17 @@ class DBusNotificationAdapter(AbstractNotificationAdapter):
return html.escape(title, quote=False)
return title
- def _get_actions_arg(self) -> QDBusArgument:
+ def _get_actions_arg(self) -> dbus.QDBusArgument:
"""Get the actions argument for present()."""
actions = []
if self._capabilities.actions:
actions = ['default', 'Activate'] # key, name
- return QDBusArgument(
+ return dbus.QDBusArgument(
actions,
- qtutils.extract_enum_val(QMetaType.Type.QStringList),
+ qtutils.extract_enum_val(core.QMetaType.Type.QStringList),
)
- def _get_hints_arg(self, *, origin_url: QUrl, icon: QImage) -> Dict[str, Any]:
+ def _get_hints_arg(self, *, origin_url: core.QUrl, icon: gui.QImage) -> Dict[str, Any]:
"""Get the hints argument for present()."""
origin_url_str = origin_url.toDisplayString()
hints: Dict[str, Any] = {
@@ -976,7 +970,7 @@ class DBusNotificationAdapter(AbstractNotificationAdapter):
if icon.isNull():
filename = 'icons/qutebrowser-64x64.png'
- icon = QImage.fromData(resources.read_file_binary(filename))
+ icon = gui.QImage.fromData(resources.read_file_binary(filename))
key = self._quirks.icon_key or "image-data"
data = self._convert_image(icon)
@@ -988,17 +982,17 @@ class DBusNotificationAdapter(AbstractNotificationAdapter):
def _call_notify_wrapper(
self, *,
appname: str,
- replaces_id: QVariant,
+ replaces_id: core.QVariant,
icon: str,
title: str,
body: str,
- actions: QDBusArgument,
+ actions: dbus.QDBusArgument,
hints: Dict[str, Any],
timeout: int,
) -> Any:
"""Wrapper around DBus call to use keyword args."""
return self.interface.call(
- QDBus.CallMode.BlockWithGui,
+ dbus.QDBus.CallMode.BlockWithGui,
"Notify",
appname,
replaces_id,
@@ -1038,7 +1032,7 @@ class DBusNotificationAdapter(AbstractNotificationAdapter):
)
try:
- self._verify_message(reply, "u", QDBusMessage.MessageType.ReplyMessage)
+ self._verify_message(reply, "u", dbus.QDBusMessage.MessageType.ReplyMessage)
except DBusError as e:
if e.is_fatal:
raise
@@ -1050,7 +1044,7 @@ class DBusNotificationAdapter(AbstractNotificationAdapter):
self._verify_notification_id(notification_id, replaces_id=replaces_id)
return notification_id
- def _convert_image(self, qimage: QImage) -> Optional[QDBusArgument]:
+ def _convert_image(self, qimage: gui.QImage) -> Optional[dbus.QDBusArgument]:
"""Convert a QImage to the structure DBus expects.
https://specifications.freedesktop.org/notification-spec/latest/ar01s05.html#icons-and-images-formats
@@ -1058,10 +1052,10 @@ class DBusNotificationAdapter(AbstractNotificationAdapter):
bits_per_color = 8
has_alpha = qimage.hasAlphaChannel()
if has_alpha:
- image_format = QImage.Format.Format_RGBA8888
+ image_format = gui.QImage.Format.Format_RGBA8888
channel_count = 4
else:
- image_format = QImage.Format.Format_RGB888
+ image_format = gui.QImage.Format.Format_RGB888
channel_count = 3
qimage.convertTo(image_format)
@@ -1069,7 +1063,7 @@ class DBusNotificationAdapter(AbstractNotificationAdapter):
width = qimage.width()
height = qimage.height()
- image_data = QDBusArgument()
+ image_data = dbus.QDBusArgument()
image_data.beginStructure()
image_data.add(width)
image_data.add(height)
@@ -1111,37 +1105,37 @@ class DBusNotificationAdapter(AbstractNotificationAdapter):
return None
bits = qimage.constBits().asstring(size)
- image_data.add(QByteArray(bits))
+ image_data.add(core.QByteArray(bits))
image_data.endStructure()
return image_data
- @pyqtSlot(QDBusMessage)
- def _handle_close(self, msg: QDBusMessage) -> None:
+ @core.pyqtSlot(dbus.QDBusMessage)
+ def _handle_close(self, msg: dbus.QDBusMessage) -> None:
"""Handle NotificationClosed from DBus."""
try:
- self._verify_message(msg, "uu", QDBusMessage.MessageType.SignalMessage)
+ self._verify_message(msg, "uu", dbus.QDBusMessage.MessageType.SignalMessage)
except Error:
if not self._quirks.wrong_closes_type:
raise
- self._verify_message(msg, "ui", QDBusMessage.MessageType.SignalMessage)
+ self._verify_message(msg, "ui", dbus.QDBusMessage.MessageType.SignalMessage)
notification_id, _close_reason = msg.arguments()
self.close_id.emit(notification_id)
- @pyqtSlot(QDBusMessage)
- def _handle_action(self, msg: QDBusMessage) -> None:
+ @core.pyqtSlot(dbus.QDBusMessage)
+ def _handle_action(self, msg: dbus.QDBusMessage) -> None:
"""Handle ActionInvoked from DBus."""
- self._verify_message(msg, "us", QDBusMessage.MessageType.SignalMessage)
+ self._verify_message(msg, "us", dbus.QDBusMessage.MessageType.SignalMessage)
notification_id, action_key = msg.arguments()
if action_key == "default":
self.click_id.emit(notification_id)
- @pyqtSlot(int)
+ @core.pyqtSlot(int)
def on_web_closed(self, notification_id: int) -> None:
"""Send CloseNotification if a notification was closed from JS."""
self.interface.call(
- QDBus.CallMode.NoBlock,
+ dbus.QDBus.CallMode.NoBlock,
"CloseNotification",
_as_uint32(notification_id),
)
@@ -1149,10 +1143,10 @@ class DBusNotificationAdapter(AbstractNotificationAdapter):
def _fetch_capabilities(self) -> None:
"""Fetch capabilities from the notification server."""
reply = self.interface.call(
- QDBus.CallMode.BlockWithGui,
+ dbus.QDBus.CallMode.BlockWithGui,
"GetCapabilities",
)
- self._verify_message(reply, "as", QDBusMessage.MessageType.ReplyMessage)
+ self._verify_message(reply, "as", dbus.QDBusMessage.MessageType.ReplyMessage)
caplist = reply.arguments()[0]
self._capabilities = _ServerCapabilities.from_list(caplist)
@@ -1163,7 +1157,7 @@ class DBusNotificationAdapter(AbstractNotificationAdapter):
log.misc.debug(f"Notification server capabilities: {self._capabilities}")
- def _format_body(self, body: str, origin_url: QUrl) -> str:
+ def _format_body(self, body: str, origin_url: core.QUrl) -> str:
"""Format the body according to the server capabilities.
If the server doesn't support x-kde-origin-name, we include the origin URL as a
@@ -1179,7 +1173,7 @@ class DBusNotificationAdapter(AbstractNotificationAdapter):
prefix = None
elif self._capabilities.body_markup and self._capabilities.body_hyperlinks:
href = html.escape(
- origin_url.toString(QUrl.ComponentFormattingOption.FullyEncoded) # type: ignore[arg-type]
+ origin_url.toString(core.QUrl.ComponentFormattingOption.FullyEncoded) # type: ignore[arg-type]
)
text = html.escape(urlstr, quote=False)
prefix = f'<a href="{href}">{text}</a>'
diff --git a/qutebrowser/browser/webengine/tabhistory.py b/qutebrowser/browser/webengine/tabhistory.py
index 6efc6a2aa..1c73e557e 100644
--- a/qutebrowser/browser/webengine/tabhistory.py
+++ b/qutebrowser/browser/webengine/tabhistory.py
@@ -19,9 +19,8 @@
"""QWebHistory serializer for QtWebEngine."""
-from qutebrowser.qt.core import QByteArray, QDataStream, QIODevice, QUrl
-
from qutebrowser.utils import qtutils
+from qutebrowser.qt import core
# kHistoryStreamVersion = 3 was originally set when history serializing was
@@ -64,7 +63,7 @@ def _serialize_item(item, stream):
## QByteArray(encodedPageState.data(), encodedPageState.size());
# \xff\xff\xff\xff
- qtutils.serialize_stream(stream, QByteArray())
+ qtutils.serialize_stream(stream, core.QByteArray())
## static_cast<qint32>(entry->GetTransitionType());
# chromium/ui/base/page_transition_types.h
@@ -77,7 +76,7 @@ def _serialize_item(item, stream):
## toQt(entry->GetReferrer().url);
# \xff\xff\xff\xff
- qtutils.serialize_stream(stream, QUrl())
+ qtutils.serialize_stream(stream, core.QUrl())
## static_cast<qint32>(entry->GetReferrer().policy);
# chromium/third_party/WebKit/public/platform/WebReferrerPolicy.h
@@ -123,8 +122,8 @@ def serialize(items):
If 'data' goes out of scope, reading from 'stream' will result in a
segfault!
"""
- data = QByteArray()
- stream = QDataStream(data, QIODevice.OpenModeFlag.ReadWrite)
+ data = core.QByteArray()
+ stream = core.QDataStream(data, core.QIODevice.OpenModeFlag.ReadWrite)
cur_user_data = None
current_idx = None
diff --git a/qutebrowser/browser/webengine/webenginedownloads.py b/qutebrowser/browser/webengine/webenginedownloads.py
index 363feeb57..c29842ac4 100644
--- a/qutebrowser/browser/webengine/webenginedownloads.py
+++ b/qutebrowser/browser/webengine/webenginedownloads.py
@@ -22,13 +22,12 @@
import re
import os.path
import functools
-
-from qutebrowser.qt.core import pyqtSlot, Qt, QUrl, QObject
-from qutebrowser.qt.webenginecore import QWebEngineDownloadRequest
+from qutebrowser.qt import webenginecore
from qutebrowser.browser import downloads, pdfjs
from qutebrowser.utils import (debug, usertypes, message, log, objreg, urlutils,
utils, version)
+from qutebrowser.qt import core
class DownloadItem(downloads.AbstractDownloadItem):
@@ -39,9 +38,9 @@ class DownloadItem(downloads.AbstractDownloadItem):
_qt_item: The wrapped item.
"""
- def __init__(self, qt_item: QWebEngineDownloadRequest,
+ def __init__(self, qt_item: webenginecore.QWebEngineDownloadRequest,
manager: downloads.AbstractDownloadManager,
- parent: QObject = None) -> None:
+ parent: core.QObject = None) -> None:
super().__init__(manager=manager, parent=manager)
self._qt_item = qt_item
try:
@@ -71,19 +70,19 @@ class DownloadItem(downloads.AbstractDownloadItem):
def _is_page_download(self):
"""Check if this item is a page (i.e. mhtml) download."""
return (self._qt_item.savePageFormat() !=
- QWebEngineDownloadRequest.SavePageFormat.UnknownSaveFormat)
+ webenginecore.QWebEngineDownloadRequest.SavePageFormat.UnknownSaveFormat)
- @pyqtSlot(QWebEngineDownloadRequest.DownloadState)
+ @core.pyqtSlot(webenginecore.QWebEngineDownloadRequest.DownloadState)
def _on_state_changed(self, state):
- state_name = debug.qenum_key(QWebEngineDownloadRequest, state)
+ state_name = debug.qenum_key(webenginecore.QWebEngineDownloadRequest, state)
log.downloads.debug("State for {!r} changed to {}".format(
self, state_name))
- if state == QWebEngineDownloadRequest.DownloadState.DownloadRequested:
+ if state == webenginecore.QWebEngineDownloadRequest.DownloadState.DownloadRequested:
pass
- elif state == QWebEngineDownloadRequest.DownloadState.DownloadInProgress:
+ elif state == webenginecore.QWebEngineDownloadRequest.DownloadState.DownloadInProgress:
pass
- elif state == QWebEngineDownloadRequest.DownloadState.DownloadCompleted:
+ elif state == webenginecore.QWebEngineDownloadRequest.DownloadState.DownloadCompleted:
log.downloads.debug("Download {} finished".format(self.basename))
if self._is_page_download():
# Same logging as QtWebKit mhtml downloads.
@@ -92,12 +91,12 @@ class DownloadItem(downloads.AbstractDownloadItem):
self.done = True
self.finished.emit()
self.stats.finish()
- elif state == QWebEngineDownloadRequest.DownloadState.DownloadCancelled:
+ elif state == webenginecore.QWebEngineDownloadRequest.DownloadState.DownloadCancelled:
self.successful = False
self.done = True
self.cancelled.emit()
self.stats.finish()
- elif state == QWebEngineDownloadRequest.DownloadState.DownloadInterrupted:
+ elif state == webenginecore.QWebEngineDownloadRequest.DownloadState.DownloadInterrupted:
self.successful = False
reason = self._qt_item.interruptReasonString()
self._die(reason)
@@ -113,22 +112,22 @@ class DownloadItem(downloads.AbstractDownloadItem):
# Qt 6
self._qt_item.receivedBytesChanged.disconnect()
self._qt_item.totalBytesChanged.disconnect()
- if self._qt_item.state() != QWebEngineDownloadRequest.DownloadState.DownloadInterrupted:
+ if self._qt_item.state() != webenginecore.QWebEngineDownloadRequest.DownloadState.DownloadInterrupted:
self._qt_item.cancel()
def _do_cancel(self):
state = self._qt_item.state()
- state_name = debug.qenum_key(QWebEngineDownloadRequest, state)
- assert state not in [QWebEngineDownloadRequest.DownloadState.DownloadCompleted,
- QWebEngineDownloadRequest.DownloadState.DownloadCancelled], state_name
+ state_name = debug.qenum_key(webenginecore.QWebEngineDownloadRequest, state)
+ assert state not in [webenginecore.QWebEngineDownloadRequest.DownloadState.DownloadCompleted,
+ webenginecore.QWebEngineDownloadRequest.DownloadState.DownloadCancelled], state_name
self._qt_item.cancel()
def retry(self):
state = self._qt_item.state()
- if state != QWebEngineDownloadRequest.DownloadState.DownloadInterrupted:
+ if state != webenginecore.QWebEngineDownloadRequest.DownloadState.DownloadInterrupted:
log.downloads.warning(
"Refusing to retry download in state {}".format(
- debug.qenum_key(QWebEngineDownloadRequest, state)))
+ debug.qenum_key(webenginecore.QWebEngineDownloadRequest, state)))
return
self._qt_item.resume()
@@ -136,12 +135,12 @@ class DownloadItem(downloads.AbstractDownloadItem):
def _get_open_filename(self):
return self._filename
- def url(self) -> QUrl:
+ def url(self) -> core.QUrl:
return self._qt_item.url()
- def origin(self) -> QUrl:
+ def origin(self) -> core.QUrl:
page = self._qt_item.page()
- return page.url() if page else QUrl()
+ return page.url() if page else core.QUrl()
def _set_fileobj(self, fileobj, *, autoclose=True):
raise downloads.UnsupportedOperationError
@@ -153,8 +152,8 @@ class DownloadItem(downloads.AbstractDownloadItem):
def _ensure_can_set_filename(self, filename):
state = self._qt_item.state()
- if state != QWebEngineDownloadRequest.DownloadState.DownloadRequested:
- state_name = debug.qenum_key(QWebEngineDownloadRequest, state)
+ if state != webenginecore.QWebEngineDownloadRequest.DownloadState.DownloadRequested:
+ state_name = debug.qenum_key(webenginecore.QWebEngineDownloadRequest, state)
raise ValueError("Trying to set filename {} on {!r} which is "
"state {} (not in requested state)!".format(
filename, self, state_name))
@@ -263,9 +262,9 @@ class DownloadManager(downloads.AbstractDownloadManager):
def install(self, profile):
"""Set up the download manager on a QWebEngineProfile."""
profile.downloadRequested.connect(self.handle_download,
- Qt.ConnectionType.DirectConnection)
+ core.Qt.ConnectionType.DirectConnection)
- @pyqtSlot(QWebEngineDownloadRequest)
+ @core.pyqtSlot(webenginecore.QWebEngineDownloadRequest)
def handle_download(self, qt_item):
"""Start a download coming from a QWebEngineProfile."""
qt_filename = qt_item.downloadFileName()
diff --git a/qutebrowser/browser/webengine/webengineelem.py b/qutebrowser/browser/webengine/webengineelem.py
index 2e348055c..34a7672eb 100644
--- a/qutebrowser/browser/webengine/webengineelem.py
+++ b/qutebrowser/browser/webengine/webengineelem.py
@@ -21,13 +21,12 @@
from typing import (
TYPE_CHECKING, Any, Callable, Dict, Iterator, Optional, Set, Tuple, Union)
-
-from qutebrowser.qt.core import QRect, QEventLoop
-from qutebrowser.qt.widgets import QApplication
-from qutebrowser.qt.webenginecore import QWebEngineSettings
+from qutebrowser.qt import widgets
+from qutebrowser.qt import webenginecore
from qutebrowser.utils import log, javascript, urlutils, usertypes, utils
from qutebrowser.browser import webelem
+from qutebrowser.qt import core
if TYPE_CHECKING:
from qutebrowser.browser.webengine import webenginetab
@@ -116,9 +115,9 @@ class WebEngineElement(webelem.AbstractWebElement):
def has_frame(self) -> bool:
return True
- def geometry(self) -> QRect:
+ def geometry(self) -> core.QRect:
log.stub()
- return QRect()
+ return core.QRect()
def classes(self) -> Set[str]:
"""Get a list of classes assigned to this element."""
@@ -165,8 +164,8 @@ class WebEngineElement(webelem.AbstractWebElement):
log.webelem.debug("Inserting text into element {!r}".format(self))
self._js_call('insert_text', text)
- def rect_on_view(self, *, elem_geometry: QRect = None,
- no_js: bool = False) -> QRect:
+ def rect_on_view(self, *, elem_geometry: core.QRect = None,
+ no_js: bool = False) -> core.QRect:
"""Get the geometry of the element relative to the webview.
Skipping of small rectangles is due to <a> elements containing other
@@ -195,7 +194,7 @@ class WebEngineElement(webelem.AbstractWebElement):
# We're not checking for zoom.text_only here as that doesn't
# exist for QtWebEngine.
zoom = self._tab.zoom.factor()
- rect = QRect(int(left * zoom), int(top * zoom),
+ rect = core.QRect(int(left * zoom), int(top * zoom),
int(width * zoom), int(height * zoom))
# FIXME:qtwebengine
# frame = self._elem.webFrame()
@@ -207,7 +206,7 @@ class WebEngineElement(webelem.AbstractWebElement):
return rect
log.webelem.debug("Couldn't find rectangle for {!r} ({})".format(
self, rects))
- return QRect()
+ return core.QRect()
def remove_blank_target(self) -> None:
if self._js_dict['attributes'].get('target') == '_blank':
@@ -241,7 +240,7 @@ class WebEngineElement(webelem.AbstractWebElement):
view = self._tab._widget
assert view is not None
# pylint: enable=protected-access
- attribute = QWebEngineSettings.WebAttribute.JavascriptCanOpenWindows
+ attribute = webenginecore.QWebEngineSettings.WebAttribute.JavascriptCanOpenWindows
could_open_windows = view.settings().testAttribute(attribute)
view.settings().setAttribute(attribute, True)
@@ -249,9 +248,9 @@ class WebEngineElement(webelem.AbstractWebElement):
# (it does so with a 0ms QTimer...)
# This is also used in Qt's tests:
# https://github.com/qt/qtwebengine/commit/5e572e88efa7ba7c2b9138ec19e606d3e345ac90
- QApplication.processEvents(
- QEventLoop.ProcessEventsFlag.ExcludeSocketNotifiers |
- QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents)
+ widgets.QApplication.processEvents(
+ core.QEventLoop.ProcessEventsFlag.ExcludeSocketNotifiers |
+ core.QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents)
def reset_setting(_arg: Any) -> None:
"""Set the JavascriptCanOpenWindows setting to its old value."""
diff --git a/qutebrowser/browser/webengine/webengineinspector.py b/qutebrowser/browser/webengine/webengineinspector.py
index 3ba72a7d1..be2eee41d 100644
--- a/qutebrowser/browser/webengine/webengineinspector.py
+++ b/qutebrowser/browser/webengine/webengineinspector.py
@@ -19,9 +19,8 @@
"""Customized QWebInspector for QtWebEngine."""
-from qutebrowser.qt.webenginewidgets import QWebEngineView
-from qutebrowser.qt.webenginecore import QWebEnginePage
-from qutebrowser.qt.widgets import QWidget
+from qutebrowser.qt import widgets, webenginewidgets
+from qutebrowser.qt import webenginecore
from qutebrowser.browser import inspector
from qutebrowser.browser.webengine import webenginesettings, webview
@@ -30,7 +29,7 @@ from qutebrowser.utils import version, usertypes, qtutils
from qutebrowser.keyinput import modeman
-class WebEngineInspectorView(QWebEngineView):
+class WebEngineInspectorView(webenginewidgets.QWebEngineView):
"""The QWebEngineView used for the inspector.
@@ -39,7 +38,7 @@ class WebEngineInspectorView(QWebEngineView):
"""
def createWindow(self,
- wintype: QWebEnginePage.WebWindowType) -> QWebEngineView:
+ wintype: webenginecore.QWebEnginePage.WebWindowType) -> webenginewidgets.QWebEngineView:
"""Called by Qt when a page wants to create a new tab or window.
In case the user wants to open a resource in a new tab, we use the
@@ -51,7 +50,7 @@ class WebEngineInspectorView(QWebEngineView):
try:
# Qt 5
view = inspected_page.view()
- assert isinstance(view, QWebEngineView), view
+ assert isinstance(view, webenginewidgets.QWebEngineView), view
return view.createWindow(wintype)
except AttributeError:
# Qt 6
@@ -67,7 +66,7 @@ class WebEngineInspector(inspector.AbstractWebInspector):
def __init__(self, splitter: miscwidgets.InspectorSplitter,
win_id: int,
- parent: QWidget = None) -> None:
+ parent: widgets.QWidget = None) -> None:
super().__init__(splitter, win_id, parent)
self._check_devtools_resources()
self._settings = None
@@ -99,10 +98,10 @@ class WebEngineInspector(inspector.AbstractWebInspector):
"please install the qt5-qtwebengine-devtools "
"Fedora package.")
- def inspect(self, page: QWebEnginePage) -> None:
+ def inspect(self, page: webenginecore.QWebEnginePage) -> None:
if not self._widget:
view = WebEngineInspectorView()
- inspector_page = QWebEnginePage(
+ inspector_page = webenginecore.QWebEnginePage(
page.profile(),
self
)
diff --git a/qutebrowser/browser/webengine/webenginequtescheme.py b/qutebrowser/browser/webengine/webenginequtescheme.py
index 6fb809f6d..1b17d6859 100644
--- a/qutebrowser/browser/webengine/webenginequtescheme.py
+++ b/qutebrowser/browser/webengine/webenginequtescheme.py
@@ -19,23 +19,19 @@
"""QtWebEngine specific qute://* handlers and glue code."""
-from qutebrowser.qt.core import QBuffer, QIODevice, QUrl
-from qutebrowser.qt.webenginecore import (QWebEngineUrlSchemeHandler,
- QWebEngineUrlRequestJob,
- QWebEngineUrlScheme)
-
from qutebrowser.browser import qutescheme
from qutebrowser.utils import log, qtutils
+from qutebrowser.qt import webenginecore, core
-class QuteSchemeHandler(QWebEngineUrlSchemeHandler):
+class QuteSchemeHandler(webenginecore.QWebEngineUrlSchemeHandler):
"""Handle qute://* requests on QtWebEngine."""
def install(self, profile):
"""Install the handler for qute:// URLs on the given profile."""
- if QWebEngineUrlScheme is not None:
- assert QWebEngineUrlScheme.schemeByName(b'qute') is not None
+ if webenginecore.QWebEngineUrlScheme is not None:
+ assert webenginecore.QWebEngineUrlScheme.schemeByName(b'qute') is not None
profile.installUrlSchemeHandler(b'qute', self)
@@ -55,7 +51,7 @@ class QuteSchemeHandler(QWebEngineUrlSchemeHandler):
request_url = job.requestUrl()
# https://codereview.qt-project.org/#/c/234849/
- is_opaque = initiator == QUrl('null')
+ is_opaque = initiator == core.QUrl('null')
target = request_url.scheme(), request_url.host()
if target == ('qute', 'testdata') and is_opaque:
@@ -67,7 +63,7 @@ class QuteSchemeHandler(QWebEngineUrlSchemeHandler):
log.network.warning("Blocking malicious request from {} to {}"
.format(initiator.toDisplayString(),
request_url.toDisplayString()))
- job.fail(QWebEngineUrlRequestJob.Error.RequestDenied)
+ job.fail(webenginecore.QWebEngineUrlRequestJob.Error.RequestDenied)
return False
return True
@@ -87,7 +83,7 @@ class QuteSchemeHandler(QWebEngineUrlSchemeHandler):
return
if job.requestMethod() != b'GET':
- job.fail(QWebEngineUrlRequestJob.Error.RequestDenied)
+ job.fail(webenginecore.QWebEngineUrlRequestJob.Error.RequestDenied)
return
assert url.scheme() == 'qute'
@@ -98,15 +94,15 @@ class QuteSchemeHandler(QWebEngineUrlSchemeHandler):
except qutescheme.Error as e:
errors = {
qutescheme.NotFoundError:
- QWebEngineUrlRequestJob.Error.UrlNotFound,
+ webenginecore.QWebEngineUrlRequestJob.Error.UrlNotFound,
qutescheme.UrlInvalidError:
- QWebEngineUrlRequestJob.Error.UrlInvalid,
+ webenginecore.QWebEngineUrlRequestJob.Error.UrlInvalid,
qutescheme.RequestDeniedError:
- QWebEngineUrlRequestJob.Error.RequestDenied,
+ webenginecore.QWebEngineUrlRequestJob.Error.RequestDenied,
qutescheme.SchemeOSError:
- QWebEngineUrlRequestJob.Error.UrlNotFound,
+ webenginecore.QWebEngineUrlRequestJob.Error.UrlNotFound,
qutescheme.Error:
- QWebEngineUrlRequestJob.Error.RequestFailed,
+ webenginecore.QWebEngineUrlRequestJob.Error.RequestFailed,
}
exctype = type(e)
log.network.error(f"{exctype.__name__} while handling qute://* URL: {e}")
@@ -120,8 +116,8 @@ class QuteSchemeHandler(QWebEngineUrlSchemeHandler):
# We can't just use the QBuffer constructor taking a QByteArray,
# because that somehow segfaults...
# https://www.riverbankcomputing.com/pipermail/pyqt/2016-September/038075.html
- buf = QBuffer(parent=self)
- buf.open(QIODevice.OpenModeFlag.WriteOnly)
+ buf = core.QBuffer(parent=self)
+ buf.open(core.QIODevice.OpenModeFlag.WriteOnly)
buf.write(data)
buf.seek(0)
buf.close()
@@ -134,10 +130,10 @@ def init():
Note this needs to be called early, before constructing any QtWebEngine
classes.
"""
- if QWebEngineUrlScheme is not None:
- assert not QWebEngineUrlScheme.schemeByName(b'qute').name()
- scheme = QWebEngineUrlScheme(b'qute')
+ if webenginecore.QWebEngineUrlScheme is not None:
+ assert not webenginecore.QWebEngineUrlScheme.schemeByName(b'qute').name()
+ scheme = webenginecore.QWebEngineUrlScheme(b'qute')
scheme.setFlags(
- QWebEngineUrlScheme.Flag.LocalScheme |
- QWebEngineUrlScheme.Flag.LocalAccessAllowed)
- QWebEngineUrlScheme.registerScheme(scheme)
+ webenginecore.QWebEngineUrlScheme.Flag.LocalScheme |
+ webenginecore.QWebEngineUrlScheme.Flag.LocalAccessAllowed)
+ webenginecore.QWebEngineUrlScheme.registerScheme(scheme)
diff --git a/qutebrowser/browser/webengine/webenginesettings.py b/qutebrowser/browser/webengine/webenginesettings.py
index 8a8c4766f..b24dcd55c 100644
--- a/qutebrowser/browser/webengine/webenginesettings.py
+++ b/qutebrowser/browser/webengine/webenginesettings.py
@@ -29,10 +29,7 @@ import operator
import pathlib
from typing import cast, Any, List, Optional, Tuple, Union, TYPE_CHECKING
-from qutebrowser.qt import machinery
-from qutebrowser.qt.gui import QFont
-from qutebrowser.qt.widgets import QApplication
-from qutebrowser.qt.webenginecore import QWebEngineSettings, QWebEngineProfile
+from qutebrowser.qt import widgets, webenginecore, gui, machinery
from qutebrowser.browser import history
from qutebrowser.browser.webengine import (spell, webenginequtescheme, cookies,
@@ -45,9 +42,9 @@ if TYPE_CHECKING:
from qutebrowser.browser.webengine import interceptor
# The default QWebEngineProfile
-default_profile = cast(QWebEngineProfile, None)
+default_profile = cast(webenginecore.QWebEngineProfile, None)
# The QWebEngineProfile used for private (off-the-record) windows
-private_profile: Optional[QWebEngineProfile] = None
+private_profile: Optional[webenginecore.QWebEngineProfile] = None
# The global WebEngineSettings object
_global_settings = cast('WebEngineSettings', None)
@@ -112,105 +109,105 @@ class WebEngineSettings(websettings.AbstractSettings):
_ATTRIBUTES = {
'content.xss_auditing':
- Attr(QWebEngineSettings.WebAttribute.XSSAuditingEnabled),
+ Attr(webenginecore.QWebEngineSettings.WebAttribute.XSSAuditingEnabled),
'content.images':
- Attr(QWebEngineSettings.WebAttribute.AutoLoadImages),
+ Attr(webenginecore.QWebEngineSettings.WebAttribute.AutoLoadImages),
'content.javascript.enabled':
- Attr(QWebEngineSettings.WebAttribute.JavascriptEnabled),
+ Attr(webenginecore.QWebEngineSettings.WebAttribute.JavascriptEnabled),
'content.javascript.can_open_tabs_automatically':
- Attr(QWebEngineSettings.WebAttribute.JavascriptCanOpenWindows),
+ Attr(webenginecore.QWebEngineSettings.WebAttribute.JavascriptCanOpenWindows),
'content.plugins':
- Attr(QWebEngineSettings.WebAttribute.PluginsEnabled),
+ Attr(webenginecore.QWebEngineSettings.WebAttribute.PluginsEnabled),
'content.hyperlink_auditing':
- Attr(QWebEngineSettings.WebAttribute.HyperlinkAuditingEnabled),
+ Attr(webenginecore.QWebEngineSettings.WebAttribute.HyperlinkAuditingEnabled),
'content.local_content_can_access_remote_urls':
- Attr(QWebEngineSettings.WebAttribute.LocalContentCanAccessRemoteUrls),
+ Attr(webenginecore.QWebEngineSettings.WebAttribute.LocalContentCanAccessRemoteUrls),
'content.local_content_can_access_file_urls':
- Attr(QWebEngineSettings.WebAttribute.LocalContentCanAccessFileUrls),
+ Attr(webenginecore.QWebEngineSettings.WebAttribute.LocalContentCanAccessFileUrls),
'content.webgl':
- Attr(QWebEngineSettings.WebAttribute.WebGLEnabled),
+ Attr(webenginecore.QWebEngineSettings.WebAttribute.WebGLEnabled),
'content.local_storage':
- Attr(QWebEngineSettings.WebAttribute.LocalStorageEnabled),
+ Attr(webenginecore.QWebEngineSettings.WebAttribute.LocalStorageEnabled),
'content.desktop_capture':
- Attr(QWebEngineSettings.WebAttribute.ScreenCaptureEnabled,
+ Attr(webenginecore.QWebEngineSettings.WebAttribute.ScreenCaptureEnabled,
converter=lambda val: True if val == 'ask' else val),
# 'ask' is handled via the permission system
'input.spatial_navigation':
- Attr(QWebEngineSettings.WebAttribute.SpatialNavigationEnabled),
+ Attr(webenginecore.QWebEngineSettings.WebAttribute.SpatialNavigationEnabled),
'input.links_included_in_focus_chain':
- Attr(QWebEngineSettings.WebAttribute.LinksIncludedInFocusChain),
+ Attr(webenginecore.QWebEngineSettings.WebAttribute.LinksIncludedInFocusChain),
'scrolling.smooth':
- Attr(QWebEngineSettings.WebAttribute.ScrollAnimatorEnabled),
+ Attr(webenginecore.QWebEngineSettings.WebAttribute.ScrollAnimatorEnabled),
'content.print_element_backgrounds':
- Attr(QWebEngineSettings.WebAttribute.PrintElementBackgrounds),
+ Attr(webenginecore.QWebEngineSettings.WebAttribute.PrintElementBackgrounds),
'content.autoplay':
- Attr(QWebEngineSettings.WebAttribute.PlaybackRequiresUserGesture,
+ Attr(webenginecore.QWebEngineSettings.WebAttribute.PlaybackRequiresUserGesture,
converter=operator.not_),
'content.dns_prefetch':
- Attr(QWebEngineSettings.WebAttribute.DnsPrefetchEnabled),
+ Attr(webenginecore.QWebEngineSettings.WebAttribute.DnsPrefetchEnabled),
'tabs.favicons.show':
- Attr(QWebEngineSettings.WebAttribute.AutoLoadIconsForPage,
+ Attr(webenginecore.QWebEngineSettings.WebAttribute.AutoLoadIconsForPage,
converter=lambda val: val != 'never'),
}
_FONT_SIZES = {
'fonts.web.size.minimum':
- QWebEngineSettings.FontSize.MinimumFontSize,
+ webenginecore.QWebEngineSettings.FontSize.MinimumFontSize,
'fonts.web.size.minimum_logical':
- QWebEngineSettings.FontSize.MinimumLogicalFontSize,
+ webenginecore.QWebEngineSettings.FontSize.MinimumLogicalFontSize,
'fonts.web.size.default':
- QWebEngineSettings.FontSize.DefaultFontSize,
+ webenginecore.QWebEngineSettings.FontSize.DefaultFontSize,
'fonts.web.size.default_fixed':
- QWebEngineSettings.FontSize.DefaultFixedFontSize,
+ webenginecore.QWebEngineSettings.FontSize.DefaultFixedFontSize,
}
_FONT_FAMILIES = {
- 'fonts.web.family.standard': QWebEngineSettings.FontFamily.StandardFont,
- 'fonts.web.family.fixed': QWebEngineSettings.FontFamily.FixedFont,
- 'fonts.web.family.serif': QWebEngineSettings.FontFamily.SerifFont,
- 'fonts.web.family.sans_serif': QWebEngineSettings.FontFamily.SansSerifFont,
- 'fonts.web.family.cursive': QWebEngineSettings.FontFamily.CursiveFont,
- 'fonts.web.family.fantasy': QWebEngineSettings.FontFamily.FantasyFont,
+ 'fonts.web.family.standard': webenginecore.QWebEngineSettings.FontFamily.StandardFont,
+ 'fonts.web.family.fixed': webenginecore.QWebEngineSettings.FontFamily.FixedFont,
+ 'fonts.web.family.serif': webenginecore.QWebEngineSettings.FontFamily.SerifFont,
+ 'fonts.web.family.sans_serif': webenginecore.QWebEngineSettings.FontFamily.SansSerifFont,
+ 'fonts.web.family.cursive': webenginecore.QWebEngineSettings.FontFamily.CursiveFont,
+ 'fonts.web.family.fantasy': webenginecore.QWebEngineSettings.FontFamily.FantasyFont,
}
_UNKNOWN_URL_SCHEME_POLICY = {
'disallow':
- QWebEngineSettings.UnknownUrlSchemePolicy.DisallowUnknownUrlSchemes,
+ webenginecore.QWebEngineSettings.UnknownUrlSchemePolicy.DisallowUnknownUrlSchemes,
'allow-from-user-interaction':
- QWebEngineSettings.UnknownUrlSchemePolicy.AllowUnknownUrlSchemesFromUserInteraction,
+ webenginecore.QWebEngineSettings.UnknownUrlSchemePolicy.AllowUnknownUrlSchemesFromUserInteraction,
'allow-all':
- QWebEngineSettings.UnknownUrlSchemePolicy.AllowAllUnknownUrlSchemes,
+ webenginecore.QWebEngineSettings.UnknownUrlSchemePolicy.AllowAllUnknownUrlSchemes,
}
# Mapping from WebEngineSettings::initDefaults in
# qtwebengine/src/core/web_engine_settings.cpp
_FONT_TO_QFONT = {
- QWebEngineSettings.FontFamily.StandardFont: QFont.StyleHint.Serif,
- QWebEngineSettings.FontFamily.FixedFont: QFont.StyleHint.Monospace,
- QWebEngineSettings.FontFamily.SerifFont: QFont.StyleHint.Serif,
- QWebEngineSettings.FontFamily.SansSerifFont: QFont.StyleHint.SansSerif,
- QWebEngineSettings.FontFamily.CursiveFont: QFont.StyleHint.Cursive,
- QWebEngineSettings.FontFamily.FantasyFont: QFont.StyleHint.Fantasy,
+ webenginecore.QWebEngineSettings.FontFamily.StandardFont: gui.QFont.StyleHint.Serif,
+ webenginecore.QWebEngineSettings.FontFamily.FixedFont: gui.QFont.StyleHint.Monospace,
+ webenginecore.QWebEngineSettings.FontFamily.SerifFont: gui.QFont.StyleHint.Serif,
+ webenginecore.QWebEngineSettings.FontFamily.SansSerifFont: gui.QFont.StyleHint.SansSerif,
+ webenginecore.QWebEngineSettings.FontFamily.CursiveFont: gui.QFont.StyleHint.Cursive,
+ webenginecore.QWebEngineSettings.FontFamily.FantasyFont: gui.QFont.StyleHint.Fantasy,
}
_JS_CLIPBOARD_SETTINGS = {
'none': {
- QWebEngineSettings.WebAttribute.JavascriptCanAccessClipboard: False,
- QWebEngineSettings.WebAttribute.JavascriptCanPaste: False,
+ webenginecore.QWebEngineSettings.WebAttribute.JavascriptCanAccessClipboard: False,
+ webenginecore.QWebEngineSettings.WebAttribute.JavascriptCanPaste: False,
},
'access': {
- QWebEngineSettings.WebAttribute.JavascriptCanAccessClipboard: True,
- QWebEngineSettings.WebAttribute.JavascriptCanPaste: False,
+ webenginecore.QWebEngineSettings.WebAttribute.JavascriptCanAccessClipboard: True,
+ webenginecore.QWebEngineSettings.WebAttribute.JavascriptCanPaste: False,
},
'access-paste': {
- QWebEngineSettings.WebAttribute.JavascriptCanAccessClipboard: True,
- QWebEngineSettings.WebAttribute.JavascriptCanPaste: True,
+ webenginecore.QWebEngineSettings.WebAttribute.JavascriptCanAccessClipboard: True,
+ webenginecore.QWebEngineSettings.WebAttribute.JavascriptCanPaste: True,
},
}
@@ -224,8 +221,8 @@ class WebEngineSettings(websettings.AbstractSettings):
self._settings.setUnknownUrlSchemePolicy(new_value)
def _set_js_clipboard(self, value: Union[str, usertypes.Unset]) -> None:
- attr_access = QWebEngineSettings.WebAttribute.JavascriptCanAccessClipboard
- attr_paste = QWebEngineSettings.WebAttribute.JavascriptCanPaste
+ attr_access = webenginecore.QWebEngineSettings.WebAttribute.JavascriptCanAccessClipboard
+ attr_paste = webenginecore.QWebEngineSettings.WebAttribute.JavascriptCanPaste
if isinstance(value, usertypes.Unset):
self._settings.resetAttribute(attr_access)
@@ -283,10 +280,10 @@ class ProfileSetter:
settings = self._profile.settings()
settings.setAttribute(
- QWebEngineSettings.WebAttribute.FullScreenSupportEnabled, True)
+ webenginecore.QWebEngineSettings.WebAttribute.FullScreenSupportEnabled, True)
settings.setAttribute(
- QWebEngineSettings.WebAttribute.FocusOnNavigationEnabled, False)
- settings.setAttribute(QWebEngineSettings.WebAttribute.PdfViewerEnabled, False)
+ webenginecore.QWebEngineSettings.WebAttribute.FocusOnNavigationEnabled, False)
+ settings.setAttribute(webenginecore.QWebEngineSettings.WebAttribute.PdfViewerEnabled, False)
def set_http_headers(self):
"""Set the user agent and accept-language for the given profile.
@@ -318,9 +315,9 @@ class ProfileSetter:
if self._profile.isOffTheRecord():
return
if config.val.content.cookies.store:
- value = QWebEngineProfile.PersistentCookiesPolicy.AllowPersistentCookies
+ value = webenginecore.QWebEngineProfile.PersistentCookiesPolicy.AllowPersistentCookies
else:
- value = QWebEngineProfile.PersistentCookiesPolicy.NoPersistentCookies
+ value = webenginecore.QWebEngineProfile.PersistentCookiesPolicy.NoPersistentCookies
self._profile.setPersistentCookiesPolicy(value)
def set_dictionary_language(self):
@@ -356,10 +353,10 @@ def _init_user_agent_str(ua):
def init_user_agent():
- _init_user_agent_str(QWebEngineProfile.defaultProfile().httpUserAgent())
+ _init_user_agent_str(webenginecore.QWebEngineProfile.defaultProfile().httpUserAgent())
-def _init_profile(profile: QWebEngineProfile) -> None:
+def _init_profile(profile: webenginecore.QWebEngineProfile) -> None:
"""Initialize a new QWebEngineProfile.
This currently only contains the steps which are shared between a private and a
@@ -390,9 +387,9 @@ def _init_default_profile():
global default_profile
if machinery.IS_QT6:
- default_profile = QWebEngineProfile("Default")
+ default_profile = webenginecore.QWebEngineProfile("Default")
else:
- default_profile = QWebEngineProfile.defaultProfile()
+ default_profile = webenginecore.QWebEngineProfile.defaultProfile()
assert not default_profile.isOffTheRecord()
assert parsed_user_agent is None # avoid earlier profile initialization
@@ -422,7 +419,7 @@ def init_private_profile():
if qtutils.is_single_process():
return
- private_profile = QWebEngineProfile()
+ private_profile = webenginecore.QWebEngineProfile()
assert private_profile.isOffTheRecord()
_init_profile(private_profile)
@@ -527,7 +524,7 @@ def init():
# won't work...
# https://www.riverbankcomputing.com/pipermail/pyqt/2016-September/038075.html
global _qute_scheme_handler
- app = QApplication.instance()
+ app = widgets.QApplication.instance()
log.init.debug("Initializing qute://* handler...")
_qute_scheme_handler = webenginequtescheme.QuteSchemeHandler(parent=app)
diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py
index 37750e343..592a6e2e7 100644
--- a/qutebrowser/browser/webengine/webenginetab.py
+++ b/qutebrowser/browser/webengine/webenginetab.py
@@ -25,12 +25,7 @@ import dataclasses
import re
import html as html_utils
from typing import cast, Union, Optional
-
-from qutebrowser.qt.core import (pyqtSignal, pyqtSlot, Qt, QPoint, QPointF, QTimer, QUrl,
- QObject)
-from qutebrowser.qt.network import QAuthenticator
-from qutebrowser.qt.webenginewidgets import QWebEngineView
-from qutebrowser.qt.webenginecore import QWebEnginePage, QWebEngineScript, QWebEngineHistory
+from qutebrowser.qt import webenginewidgets, webenginecore, network
from qutebrowser.config import config
from qutebrowser.browser import browsertab, eventfilter, shared, webelem, greasemonkey
@@ -40,16 +35,16 @@ from qutebrowser.browser.webengine import (webview, webengineelem, tabhistory,
from qutebrowser.utils import (usertypes, qtutils, log, javascript, utils,
resources, message, jinja, debug, version)
-from qutebrowser.qt import sip
+from qutebrowser.qt import core, sip
from qutebrowser.misc import objects, miscwidgets
# Mapping worlds from usertypes.JsWorld to QWebEngineScript world IDs.
_JS_WORLD_MAP = {
- usertypes.JsWorld.main: QWebEngineScript.ScriptWorldId.MainWorld,
- usertypes.JsWorld.application: QWebEngineScript.ScriptWorldId.ApplicationWorld,
- usertypes.JsWorld.user: QWebEngineScript.ScriptWorldId.UserWorld,
- usertypes.JsWorld.jseval: QWebEngineScript.ScriptWorldId.UserWorld + 1,
+ usertypes.JsWorld.main: webenginecore.QWebEngineScript.ScriptWorldId.MainWorld,
+ usertypes.JsWorld.application: webenginecore.QWebEngineScript.ScriptWorldId.ApplicationWorld,
+ usertypes.JsWorld.user: webenginecore.QWebEngineScript.ScriptWorldId.UserWorld,
+ usertypes.JsWorld.jseval: webenginecore.QWebEngineScript.ScriptWorldId.UserWorld + 1,
}
@@ -58,21 +53,21 @@ class WebEngineAction(browsertab.AbstractAction):
"""QtWebEngine implementations related to web actions."""
_widget: webview.WebEngineView
- action_base = QWebEnginePage.WebAction
+ action_base = webenginecore.QWebEnginePage.WebAction
def exit_fullscreen(self):
- self._widget.triggerPageAction(QWebEnginePage.WebAction.ExitFullScreen)
+ self._widget.triggerPageAction(webenginecore.QWebEnginePage.WebAction.ExitFullScreen)
def save_page(self):
"""Save the current page."""
- self._widget.triggerPageAction(QWebEnginePage.WebAction.SavePage)
+ self._widget.triggerPageAction(webenginecore.QWebEnginePage.WebAction.SavePage)
def show_source(self, pygments=False):
if pygments:
self._show_source_pygments()
return
- self._widget.triggerPageAction(QWebEnginePage.WebAction.ViewSource)
+ self._widget.triggerPageAction(webenginecore.QWebEnginePage.WebAction.ViewSource)
class WebEnginePrinting(browsertab.AbstractPrinting):
@@ -120,12 +115,12 @@ class _FindFlags:
def to_qt(self):
"""Convert flags into Qt flags."""
# FIXME:mypy Those should be correct, reevaluate with PyQt6-stubs
- flags = QWebEnginePage.FindFlag(0)
+ flags = webenginecore.QWebEnginePage.FindFlag(0)
if self.case_sensitive:
flags |= ( # type: ignore[assignment]
- QWebEnginePage.FindFlag.FindCaseSensitively)
+ webenginecore.QWebEnginePage.FindFlag.FindCaseSensitively)
if self.backward:
- flags |= QWebEnginePage.FindFlag.FindBackward # type: ignore[assignment]
+ flags |= webenginecore.QWebEnginePage.FindFlag.FindBackward # type: ignore[assignment]
return flags
def __bool__(self):
@@ -310,7 +305,7 @@ class WebEngineCaret(browsertab.AbstractCaret):
flags.add('windows')
return list(flags)
- @pyqtSlot(usertypes.KeyMode)
+ @core.pyqtSlot(usertypes.KeyMode)
def _on_mode_entered(self, mode):
if mode != usertypes.KeyMode.caret:
return
@@ -338,7 +333,7 @@ class WebEngineCaret(browsertab.AbstractCaret):
else:
self.selection_toggled.emit(browsertab.SelectionState.none)
- @pyqtSlot(usertypes.KeyMode)
+ @core.pyqtSlot(usertypes.KeyMode)
def _on_mode_left(self, mode):
if mode != usertypes.KeyMode.caret:
return
@@ -502,7 +497,7 @@ class WebEngineScroller(browsertab.AbstractScroller):
def __init__(self, tab, parent=None):
super().__init__(tab, parent)
self._pos_perc = (0, 0)
- self._pos_px = QPoint()
+ self._pos_px = core.QPoint()
self._at_bottom = False
def _init_widget(self, widget):
@@ -510,12 +505,12 @@ class WebEngineScroller(browsertab.AbstractScroller):
page = widget.page()
page.scrollPositionChanged.connect(self._update_pos)
- def _repeated_key_press(self, key, count=1, modifier=Qt.KeyboardModifier.NoModifier):
+ def _repeated_key_press(self, key, count=1, modifier=core.Qt.KeyboardModifier.NoModifier):
"""Send count fake key presses to this scroller's WebEngineTab."""
for _ in range(min(count, 1000)):
self._tab.fake_key_press(key, modifier)
- @pyqtSlot(QPointF)
+ @core.pyqtSlot(core.QPointF)
def _update_pos(self, pos):
"""Update the scroll position attributes when it changed."""
self._pos_px = pos.toPoint()
@@ -589,28 +584,28 @@ class WebEngineScroller(browsertab.AbstractScroller):
self._tab.run_js_async(js_code)
def up(self, count=1):
- self._repeated_key_press(Qt.Key.Key_Up, count)
+ self._repeated_key_press(core.Qt.Key.Key_Up, count)
def down(self, count=1):
- self._repeated_key_press(Qt.Key.Key_Down, count)
+ self._repeated_key_press(core.Qt.Key.Key_Down, count)
def left(self, count=1):
- self._repeated_key_press(Qt.Key.Key_Left, count)
+ self._repeated_key_press(core.Qt.Key.Key_Left, count)
def right(self, count=1):
- self._repeated_key_press(Qt.Key.Key_Right, count)
+ self._repeated_key_press(core.Qt.Key.Key_Right, count)
def top(self):
- self._tab.fake_key_press(Qt.Key.Key_Home)
+ self._tab.fake_key_press(core.Qt.Key.Key_Home)
def bottom(self):
- self._tab.fake_key_press(Qt.Key.Key_End)
+ self._tab.fake_key_press(core.Qt.Key.Key_End)
def page_up(self, count=1):
- self._repeated_key_press(Qt.Key.Key_PageUp, count)
+ self._repeated_key_press(core.Qt.Key.Key_PageUp, count)
def page_down(self, count=1):
- self._repeated_key_press(Qt.Key.Key_PageDown, count)
+ self._repeated_key_press(core.Qt.Key.Key_PageDown, count)
def at_top(self):
return self.pos_px().y() == 0
@@ -625,7 +620,7 @@ class WebEngineHistoryPrivate(browsertab.AbstractHistoryPrivate):
def __init__(self, tab: 'WebEngineTab') -> None:
self._tab = tab
- self._history = cast(QWebEngineHistory, None)
+ self._history = cast(webenginecore.QWebEngineHistory, None)
def serialize(self):
return qtutils.serialize(self._history)
@@ -667,7 +662,7 @@ class WebEngineHistoryPrivate(browsertab.AbstractHistoryPrivate):
stream, _data, cur_data = tabhistory.serialize(items)
qtutils.deserialize_stream(stream, self._history)
- @pyqtSlot()
+ @core.pyqtSlot()
def _on_load_finished():
self._tab.scroller.to_point(cur_data['scroll-pos'])
self._tab.load_finished.disconnect(_on_load_finished)
@@ -676,7 +671,7 @@ class WebEngineHistoryPrivate(browsertab.AbstractHistoryPrivate):
if 'zoom' in cur_data:
self._tab.zoom.set_factor(cur_data['zoom'])
if ('scroll-pos' in cur_data and
- self._tab.scroller.pos_px() == QPoint(0, 0)):
+ self._tab.scroller.pos_px() == core.QPoint(0, 0)):
self._tab.load_finished.connect(_on_load_finished)
@@ -821,7 +816,7 @@ class WebEngineAudio(browsertab.AbstractAudio):
# Implements the intended two-second delay specified at
# https://doc.qt.io/qt-5/qwebenginepage.html#recentlyAudibleChanged
delay_ms = 2000
- self._silence_timer = QTimer(self)
+ self._silence_timer = core.QTimer(self)
self._silence_timer.setSingleShot(True)
self._silence_timer.setInterval(delay_ms)
@@ -864,7 +859,7 @@ class WebEngineAudio(browsertab.AbstractAudio):
page = self._widget.page()
return page.recentlyAudible()
- @pyqtSlot(QUrl)
+ @core.pyqtSlot(core.QUrl)
def _on_url_changed(self, url):
if self._overridden or not url.isValid():
return
@@ -876,32 +871,32 @@ class WebEngineAudio(browsertab.AbstractAudio):
self._on_url_changed(self._tab.url())
-class _WebEnginePermissions(QObject):
+class _WebEnginePermissions(core.QObject):
"""Handling of various permission-related signals."""
_widget: webview.WebEngineView
_options = {
- QWebEnginePage.Feature.Notifications: 'content.notifications.enabled',
- QWebEnginePage.Feature.Geolocation: 'content.geolocation',
- QWebEnginePage.Feature.MediaAudioCapture: 'content.media.audio_capture',
- QWebEnginePage.Feature.MediaVideoCapture: 'content.media.video_capture',
- QWebEnginePage.Feature.MediaAudioVideoCapture: 'content.media.audio_video_capture',
- QWebEnginePage.Feature.MouseLock: 'content.mouse_lock',
- QWebEnginePage.Feature.DesktopVideoCapture: 'content.desktop_capture',
- QWebEnginePage.Feature.DesktopAudioVideoCapture: 'content.desktop_capture',
+ webenginecore.QWebEnginePage.Feature.Notifications: 'content.notifications.enabled',
+ webenginecore.QWebEnginePage.Feature.Geolocation: 'content.geolocation',
+ webenginecore.QWebEnginePage.Feature.MediaAudioCapture: 'content.media.audio_capture',
+ webenginecore.QWebEnginePage.Feature.MediaVideoCapture: 'content.media.video_capture',
+ webenginecore.QWebEnginePage.Feature.MediaAudioVideoCapture: 'content.media.audio_video_capture',
+ webenginecore.QWebEnginePage.Feature.MouseLock: 'content.mouse_lock',
+ webenginecore.QWebEnginePage.Feature.DesktopVideoCapture: 'content.desktop_capture',
+ webenginecore.QWebEnginePage.Feature.DesktopAudioVideoCapture: 'content.desktop_capture',
}
_messages = {
- QWebEnginePage.Feature.Notifications: 'show notifications',
- QWebEnginePage.Feature.Geolocation: 'access your location',
- QWebEnginePage.Feature.MediaAudioCapture: 'record audio',
- QWebEnginePage.Feature.MediaVideoCapture: 'record video',
- QWebEnginePage.Feature.MediaAudioVideoCapture: 'record audio/video',
- QWebEnginePage.Feature.MouseLock: 'hide your mouse pointer',
- QWebEnginePage.Feature.DesktopVideoCapture: 'capture your desktop',
- QWebEnginePage.Feature.DesktopAudioVideoCapture: 'capture your desktop and audio',
+ webenginecore.QWebEnginePage.Feature.Notifications: 'show notifications',
+ webenginecore.QWebEnginePage.Feature.Geolocation: 'access your location',
+ webenginecore.QWebEnginePage.Feature.MediaAudioCapture: 'record audio',
+ webenginecore.QWebEnginePage.Feature.MediaVideoCapture: 'record video',
+ webenginecore.QWebEnginePage.Feature.MediaAudioVideoCapture: 'record audio/video',
+ webenginecore.QWebEnginePage.Feature.MouseLock: 'hide your mouse pointer',
+ webenginecore.QWebEnginePage.Feature.DesktopVideoCapture: 'capture your desktop',
+ webenginecore.QWebEnginePage.Feature.DesktopAudioVideoCapture: 'capture your desktop and audio',
}
def __init__(self, tab, parent=None):
@@ -922,7 +917,7 @@ class _WebEnginePermissions(QObject):
page.registerProtocolHandlerRequested.connect(
self._on_register_protocol_handler_requested)
- @pyqtSlot('QWebEngineFullScreenRequest')
+ @core.pyqtSlot('QWebEngineFullScreenRequest')
def _on_fullscreen_requested(self, request):
request.accept()
on = request.toggleOn()
@@ -936,18 +931,18 @@ class _WebEnginePermissions(QObject):
notif.set_timeout(timeout)
notif.show()
- @pyqtSlot(QUrl, 'QWebEnginePage::Feature')
+ @core.pyqtSlot(core.QUrl, 'QWebEnginePage::Feature')
def _on_feature_permission_requested(self, url, feature):
"""Ask the user for approval for geolocation/media/etc.."""
page = self._widget.page()
grant_permission = functools.partial(
page.setFeaturePermission, url, feature,
- QWebEnginePage.PermissionPolicy.PermissionGrantedByUser)
+ webenginecore.QWebEnginePage.PermissionPolicy.PermissionGrantedByUser)
deny_permission = functools.partial(
page.setFeaturePermission, url, feature,
- QWebEnginePage.PermissionPolicy.PermissionDeniedByUser)
+ webenginecore.QWebEnginePage.PermissionPolicy.PermissionDeniedByUser)
- permission_str = debug.qenum_key(QWebEnginePage, feature)
+ permission_str = debug.qenum_key(webenginecore.QWebEnginePage, feature)
if not url.isValid():
log.webview.warning("Ignoring feature permission {} for invalid URL {}".format(
@@ -962,7 +957,7 @@ class _WebEnginePermissions(QObject):
return
question = shared.feature_permission(
- url=url.adjusted(QUrl.UrlFormattingOption.RemovePath),
+ url=url.adjusted(core.QUrl.UrlFormattingOption.RemovePath),
option=self._options[feature], msg=self._messages[feature],
yes_action=grant_permission, no_action=deny_permission,
abort_on=[self._tab.abort_questions])
@@ -989,7 +984,7 @@ class _WebEnginePermissions(QObject):
def _on_quota_requested(self, request):
size = utils.format_size(request.requestedSize())
shared.feature_permission(
- url=request.origin().adjusted(QUrl.UrlFormattingOption.RemovePath),
+ url=request.origin().adjusted(core.QUrl.UrlFormattingOption.RemovePath),
option='content.persistent_storage',
msg='use {} of persistent storage'.format(size),
yes_action=request.accept, no_action=request.reject,
@@ -998,7 +993,7 @@ class _WebEnginePermissions(QObject):
def _on_register_protocol_handler_requested(self, request):
shared.feature_permission(
- url=request.origin().adjusted(QUrl.UrlFormattingOption.RemovePath),
+ url=request.origin().adjusted(core.QUrl.UrlFormattingOption.RemovePath),
option='content.register_protocol_handler',
msg='open all {} links'.format(request.scheme()),
yes_action=request.accept, no_action=request.reject,
@@ -1010,9 +1005,9 @@ class _WebEnginePermissions(QObject):
class _Quirk:
filename: str
- injection_point: QWebEngineScript.InjectionPoint = (
- QWebEngineScript.InjectionPoint.DocumentCreation)
- world: QWebEngineScript.ScriptWorldId = QWebEngineScript.ScriptWorldId.MainWorld
+ injection_point: webenginecore.QWebEngineScript.InjectionPoint = (
+ webenginecore.QWebEngineScript.InjectionPoint.DocumentCreation)
+ world: webenginecore.QWebEngineScript.ScriptWorldId = webenginecore.QWebEngineScript.ScriptWorldId.MainWorld
predicate: bool = True
name: Optional[str] = None
@@ -1021,7 +1016,7 @@ class _Quirk:
self.name = f"js-{self.filename.replace('_', '-')}"
-class _WebEngineScripts(QObject):
+class _WebEngineScripts(core.QObject):
_widget: webview.WebEngineView
@@ -1039,13 +1034,13 @@ class _WebEngineScripts(QObject):
self._update_stylesheet, searching=False))
self._tab.search.finished.connect(self._update_stylesheet)
- @pyqtSlot(str)
+ @core.pyqtSlot(str)
def _on_config_changed(self, option):
if option in ['scrolling.bar', 'content.user_stylesheets']:
self._init_stylesheet()
self._update_stylesheet()
- @pyqtSlot(bool)
+ @core.pyqtSlot(bool)
def _update_stylesheet(self, searching=False):
"""Update the custom stylesheet in existing tabs."""
css = shared.get_user_stylesheet(searching=searching)
@@ -1053,11 +1048,11 @@ class _WebEngineScripts(QObject):
self._tab.run_js_async(code)
def _inject_js(self, name, js_code, *,
- world=QWebEngineScript.ScriptWorldId.ApplicationWorld,
- injection_point=QWebEngineScript.InjectionPoint.DocumentCreation,
+ world=webenginecore.QWebEngineScript.ScriptWorldId.ApplicationWorld,
+ injection_point=webenginecore.QWebEngineScript.InjectionPoint.DocumentCreation,
subframes=False):
"""Inject the given script to run early on a page load."""
- script = QWebEngineScript()
+ script = webenginecore.QWebEngineScript()
script.setInjectionPoint(injection_point)
script.setSourceCode(js_code)
script.setWorldId(world)
@@ -1110,7 +1105,7 @@ class _WebEngineScripts(QObject):
)
self._inject_js('stylesheet', js_code, subframes=True)
- @pyqtSlot()
+ @core.pyqtSlot()
def _inject_all_greasemonkey_scripts(self):
scripts = self._greasemonkey.all_scripts()
self._inject_greasemonkey_scripts(scripts)
@@ -1147,7 +1142,7 @@ class _WebEngineScripts(QObject):
script.dedup_suffix += 1
seen_names.add(script.full_name())
- new_script = QWebEngineScript()
+ new_script = webenginecore.QWebEngineScript()
try:
world = int(script.jsworld)
@@ -1175,7 +1170,7 @@ class _WebEngineScripts(QObject):
# NOTE that this needs to be done before setSourceCode, so that
# QtWebEngine's parsing of GreaseMonkey tags will override it if there is a
# @run-at comment.
- new_script.setInjectionPoint(QWebEngineScript.InjectionPoint.DocumentReady)
+ new_script.setInjectionPoint(webenginecore.QWebEngineScript.InjectionPoint.DocumentReady)
new_script.setSourceCode(script.code())
new_script.setName(script.full_name())
@@ -1184,7 +1179,7 @@ class _WebEngineScripts(QObject):
if script.needs_document_end_workaround():
log.greasemonkey.debug(
f"Forcing @run-at document-end for {script.name}")
- new_script.setInjectionPoint(QWebEngineScript.InjectionPoint.DocumentReady)
+ new_script.setInjectionPoint(webenginecore.QWebEngineScript.InjectionPoint.DocumentReady)
log.greasemonkey.debug(f'adding script: {new_script.name()}')
page_scripts.insert(new_script)
@@ -1198,8 +1193,8 @@ class _WebEngineScripts(QObject):
quirks = [
_Quirk(
'whatsapp_web',
- injection_point=QWebEngineScript.InjectionPoint.DocumentReady,
- world=QWebEngineScript.ScriptWorldId.ApplicationWorld,
+ injection_point=webenginecore.QWebEngineScript.InjectionPoint.DocumentReady,
+ world=webenginecore.QWebEngineScript.ScriptWorldId.ApplicationWorld,
),
_Quirk('discord'),
_Quirk(
@@ -1273,9 +1268,9 @@ class WebEngineTab(browsertab.AbstractTab):
down.
"""
- abort_questions = pyqtSignal()
+ abort_questions = core.pyqtSignal()
- _widget: QWebEngineView
+ _widget: webenginewidgets.QWebEngineView
search: WebEngineSearch
audio: WebEngineAudio
@@ -1329,7 +1324,7 @@ class WebEngineTab(browsertab.AbstractTab):
parent=self)
self._widget.installEventFilter(self._child_event_filter)
- @pyqtSlot()
+ @core.pyqtSlot()
def _restore_zoom(self):
if sip.isdeleted(self._widget):
# https://github.com/qutebrowser/qutebrowser/issues/3498
@@ -1366,9 +1361,9 @@ class WebEngineTab(browsertab.AbstractTab):
self._widget.page().toHtml(callback)
def run_js_async(self, code, callback=None, *, world=None):
- world_id_type = Union[QWebEngineScript.ScriptWorldId, int]
+ world_id_type = Union[webenginecore.QWebEngineScript.ScriptWorldId, int]
if world is None:
- world_id: world_id_type = QWebEngineScript.ScriptWorldId.ApplicationWorld
+ world_id: world_id_type = webenginecore.QWebEngineScript.ScriptWorldId.ApplicationWorld
elif isinstance(world, int):
world_id = world
if not 0 <= world_id <= qtutils.MAX_WORLD_ID:
@@ -1385,9 +1380,9 @@ class WebEngineTab(browsertab.AbstractTab):
def reload(self, *, force=False):
if force:
- action = QWebEnginePage.WebAction.ReloadAndBypassCache
+ action = webenginecore.QWebEnginePage.WebAction.ReloadAndBypassCache
else:
- action = QWebEnginePage.WebAction.Reload
+ action = webenginecore.QWebEnginePage.WebAction.Reload
self._widget.triggerPageAction(action)
def stop(self):
@@ -1403,7 +1398,7 @@ class WebEngineTab(browsertab.AbstractTab):
def icon(self):
return self._widget.icon()
- def set_html(self, html, base_url=QUrl()):
+ def set_html(self, html, base_url=core.QUrl()):
# FIXME:qtwebengine
# check this and raise an exception if too big:
# Warning: The content will be percent encoded before being sent to the
@@ -1421,7 +1416,7 @@ class WebEngineTab(browsertab.AbstractTab):
url=url_string, error=error)
self.set_html(error_page)
- @pyqtSlot()
+ @core.pyqtSlot()
def _on_history_trigger(self):
try:
self._widget.page()
@@ -1437,10 +1432,10 @@ class WebEngineTab(browsertab.AbstractTab):
# Don't save the title if it's generated from the URL
title = self.title()
- title_url = QUrl(url)
+ title_url = core.QUrl(url)
title_url.setScheme('')
title_url_str = title_url.toDisplayString(
- QUrl.UrlFormattingOption.RemoveScheme) # type: ignore[arg-type]
+ core.QUrl.UrlFormattingOption.RemoveScheme) # type: ignore[arg-type]
if title == title_url_str.strip('/'):
title = ""
@@ -1451,26 +1446,26 @@ class WebEngineTab(browsertab.AbstractTab):
self.history_item_triggered.emit(url, requested_url, title)
- @pyqtSlot(QUrl, 'QAuthenticator*', 'QString')
+ @core.pyqtSlot(core.QUrl, 'QAuthenticator*', 'QString')
def _on_proxy_authentication_required(self, url, authenticator,
proxy_host):
"""Called when a proxy needs authentication."""
msg = "<b>{}</b> requires a username and password.".format(
html_utils.escape(proxy_host))
- urlstr = url.toString(QUrl.UrlFormattingOption.RemovePassword | QUrl.ComponentFormattingOption.FullyEncoded)
+ urlstr = url.toString(core.QUrl.UrlFormattingOption.RemovePassword | core.QUrl.ComponentFormattingOption.FullyEncoded)
answer = message.ask(
title="Proxy authentication required", text=msg,
mode=usertypes.PromptMode.user_pwd,
abort_on=[self.abort_questions], url=urlstr)
if answer is None:
- sip.assign(authenticator, QAuthenticator())
+ sip.assign(authenticator, network.QAuthenticator())
return
authenticator.setUser(answer.user)
authenticator.setPassword(answer.password)
- @pyqtSlot(QUrl, 'QAuthenticator*')
+ @core.pyqtSlot(core.QUrl, 'QAuthenticator*')
def _on_authentication_required(self, url, authenticator):
log.network.debug("Authentication requested for {}, netrc_used {}"
.format(url.toDisplayString(), self.data.netrc_used))
@@ -1486,9 +1481,9 @@ class WebEngineTab(browsertab.AbstractTab):
url, authenticator, abort_on=[self.abort_questions])
if not netrc_success and answer is None:
log.network.debug("Aborting auth")
- sip.assign(authenticator, QAuthenticator())
+ sip.assign(authenticator, network.QAuthenticator())
- @pyqtSlot()
+ @core.pyqtSlot()
def _on_load_started(self):
"""Clear search when a new load is started if needed."""
# WORKAROUND for
@@ -1498,27 +1493,27 @@ class WebEngineTab(browsertab.AbstractTab):
super()._on_load_started()
self.data.netrc_used = False
- @pyqtSlot('qint64')
+ @core.pyqtSlot('qint64')
def _on_renderer_process_pid_changed(self, pid):
log.webview.debug("Renderer process PID for tab {}: {}"
.format(self.tab_id, pid))
- @pyqtSlot(QWebEnginePage.RenderProcessTerminationStatus, int)
+ @core.pyqtSlot(webenginecore.QWebEnginePage.RenderProcessTerminationStatus, int)
def _on_render_process_terminated(self, status, exitcode):
"""Show an error when the renderer process terminated."""
- if (status == QWebEnginePage.RenderProcessTerminationStatus.AbnormalTerminationStatus and
+ if (status == webenginecore.QWebEnginePage.RenderProcessTerminationStatus.AbnormalTerminationStatus and
exitcode == 256):
# WORKAROUND for https://bugreports.qt.io/browse/QTBUG-58697
- status = QWebEnginePage.RenderProcessTerminationStatus.CrashedTerminationStatus
+ status = webenginecore.QWebEnginePage.RenderProcessTerminationStatus.CrashedTerminationStatus
status_map = {
- QWebEnginePage.RenderProcessTerminationStatus.NormalTerminationStatus:
+ webenginecore.QWebEnginePage.RenderProcessTerminationStatus.NormalTerminationStatus:
browsertab.TerminationStatus.normal,
- QWebEnginePage.RenderProcessTerminationStatus.AbnormalTerminationStatus:
+ webenginecore.QWebEnginePage.RenderProcessTerminationStatus.AbnormalTerminationStatus:
browsertab.TerminationStatus.abnormal,
- QWebEnginePage.RenderProcessTerminationStatus.CrashedTerminationStatus:
+ webenginecore.QWebEnginePage.RenderProcessTerminationStatus.CrashedTerminationStatus:
browsertab.TerminationStatus.crashed,
- QWebEnginePage.RenderProcessTerminationStatus.KilledTerminationStatus:
+ webenginecore.QWebEnginePage.RenderProcessTerminationStatus.KilledTerminationStatus:
browsertab.TerminationStatus.killed,
-1:
browsertab.TerminationStatus.unknown,
@@ -1546,7 +1541,7 @@ class WebEngineTab(browsertab.AbstractTab):
self._show_error_page(self.url(), error=error)
- @pyqtSlot(int)
+ @core.pyqtSlot(int)
def _on_load_progress(self, perc: int) -> None:
"""QtWebEngine-specific loadProgress workarounds."""
super()._on_load_progress(perc)
@@ -1557,7 +1552,7 @@ class WebEngineTab(browsertab.AbstractTab):
):
self._update_load_status(ok=True)
- @pyqtSlot(bool)
+ @core.pyqtSlot(bool)
def _on_load_finished(self, ok: bool) -> None:
"""QtWebEngine-specific loadFinished code."""
super()._on_load_finished(ok)
@@ -1571,7 +1566,7 @@ class WebEngineTab(browsertab.AbstractTab):
self._error_page_workaround,
self.settings.test_attribute('content.javascript.enabled')))
- @pyqtSlot(certificateerror.CertificateErrorWrapper)
+ @core.pyqtSlot(certificateerror.CertificateErrorWrapper)
def _on_ssl_errors(self, error):
url = error.url()
self._insecure_hosts.add(url.host())
@@ -1599,7 +1594,7 @@ class WebEngineTab(browsertab.AbstractTab):
log.network.debug("ignore {}, URL {}, requested {}".format(
error.ignore, url, self.url(requested=True)))
- @pyqtSlot()
+ @core.pyqtSlot()
def _on_print_requested(self):
"""Slot for window.print() in JS."""
try:
@@ -1607,7 +1602,7 @@ class WebEngineTab(browsertab.AbstractTab):
except browsertab.WebTabError as e:
message.error(str(e))
- @pyqtSlot(usertypes.NavigationRequest)
+ @core.pyqtSlot(usertypes.NavigationRequest)
def _on_navigation_request(self, navigation):
super()._on_navigation_request(navigation)
diff --git a/qutebrowser/browser/webengine/webview.py b/qutebrowser/browser/webengine/webview.py
index 61dfafb30..0f19902d3 100644
--- a/qutebrowser/browser/webengine/webview.py
+++ b/qutebrowser/browser/webengine/webview.py
@@ -21,11 +21,7 @@
from typing import List, Iterable
-from qutebrowser.qt import machinery
-from qutebrowser.qt.core import pyqtSignal, pyqtSlot, QUrl
-from qutebrowser.qt.gui import QPalette
-from qutebrowser.qt.webenginewidgets import QWebEngineView
-from qutebrowser.qt.webenginecore import QWebEnginePage, QWebEngineCertificateError
+from qutebrowser.qt import webenginewidgets, webenginecore, gui, core, machinery
from qutebrowser.browser import shared
from qutebrowser.browser.webengine import webenginesettings, certificateerror
@@ -34,8 +30,8 @@ from qutebrowser.utils import log, debug, usertypes
_QB_FILESELECTION_MODES = {
- QWebEnginePage.FileSelectionMode.FileSelectOpen: shared.FileSelectionMode.single_file,
- QWebEnginePage.FileSelectionMode.FileSelectOpenMultiple: shared.FileSelectionMode.multiple_files,
+ webenginecore.QWebEnginePage.FileSelectionMode.FileSelectOpen: shared.FileSelectionMode.single_file,
+ webenginecore.QWebEnginePage.FileSelectionMode.FileSelectOpenMultiple: shared.FileSelectionMode.multiple_files,
# WORKAROUND for https://bugreports.qt.io/browse/QTBUG-91489
#
# QtWebEngine doesn't expose this value from its internal
@@ -43,11 +39,11 @@ _QB_FILESELECTION_MODES = {
# the public QWebEnginePage::FileSelectionMode enum).
# However, QWebEnginePage::chooseFiles is still called with the matching value
# (2) when a file input with "webkitdirectory" is used.
- QWebEnginePage.FileSelectionMode(2): shared.FileSelectionMode.folder,
+ webenginecore.QWebEnginePage.FileSelectionMode(2): shared.FileSelectionMode.folder,
}
-class WebEngineView(QWebEngineView):
+class WebEngineView(webenginewidgets.QWebEngineView):
"""Custom QWebEngineView subclass with qutebrowser-specific features."""
@@ -56,7 +52,7 @@ class WebEngineView(QWebEngineView):
self._win_id = win_id
self._tabdata = tabdata
- theme_color = self.style().standardPalette().color(QPalette.ColorRole.Base)
+ theme_color = self.style().standardPalette().color(gui.QPalette.ColorRole.Base)
if private:
assert webenginesettings.private_profile is not None
profile = webenginesettings.private_profile
@@ -102,27 +98,27 @@ class WebEngineView(QWebEngineView):
Return:
The new QWebEngineView object.
"""
- debug_type = debug.qenum_key(QWebEnginePage, wintype)
+ debug_type = debug.qenum_key(webenginecore.QWebEnginePage, wintype)
background = config.val.tabs.background
log.webview.debug("createWindow with type {}, background {}".format(
debug_type, background))
- if wintype == QWebEnginePage.WebWindowType.WebBrowserWindow:
+ if wintype == webenginecore.QWebEnginePage.WebWindowType.WebBrowserWindow:
# Shift-Alt-Click
target = usertypes.ClickTarget.window
- elif wintype == QWebEnginePage.WebWindowType.WebDialog:
+ elif wintype == webenginecore.QWebEnginePage.WebWindowType.WebDialog:
log.webview.warning("{} requested, but we don't support "
"that!".format(debug_type))
target = usertypes.ClickTarget.tab
- elif wintype == QWebEnginePage.WebWindowType.WebBrowserTab:
+ elif wintype == webenginecore.QWebEnginePage.WebWindowType.WebBrowserTab:
# Middle-click / Ctrl-Click with Shift
# FIXME:qtwebengine this also affects target=_blank links...
if background:
target = usertypes.ClickTarget.tab
else:
target = usertypes.ClickTarget.tab_bg
- elif wintype == QWebEnginePage.WebWindowType.WebBrowserBackgroundTab:
+ elif wintype == webenginecore.QWebEnginePage.WebWindowType.WebBrowserBackgroundTab:
# Middle-click / Ctrl-Click
if background:
target = usertypes.ClickTarget.tab_bg
@@ -142,7 +138,7 @@ class WebEngineView(QWebEngineView):
super().contextMenuEvent(ev)
-class WebEnginePage(QWebEnginePage):
+class WebEnginePage(webenginecore.QWebEnginePage):
"""Custom QWebEnginePage subclass with qutebrowser-specific features.
@@ -159,33 +155,33 @@ class WebEnginePage(QWebEnginePage):
navigation_request: Emitted on acceptNavigationRequest.
"""
- certificate_error = pyqtSignal(certificateerror.CertificateErrorWrapper)
- shutting_down = pyqtSignal()
- navigation_request = pyqtSignal(usertypes.NavigationRequest)
+ certificate_error = core.pyqtSignal(certificateerror.CertificateErrorWrapper)
+ shutting_down = core.pyqtSignal()
+ navigation_request = core.pyqtSignal(usertypes.NavigationRequest)
_JS_LOG_LEVEL_MAPPING = {
- QWebEnginePage.JavaScriptConsoleMessageLevel.InfoMessageLevel:
+ webenginecore.QWebEnginePage.JavaScriptConsoleMessageLevel.InfoMessageLevel:
usertypes.JsLogLevel.info,
- QWebEnginePage.JavaScriptConsoleMessageLevel.WarningMessageLevel:
+ webenginecore.QWebEnginePage.JavaScriptConsoleMessageLevel.WarningMessageLevel:
usertypes.JsLogLevel.warning,
- QWebEnginePage.JavaScriptConsoleMessageLevel.ErrorMessageLevel:
+ webenginecore.QWebEnginePage.JavaScriptConsoleMessageLevel.ErrorMessageLevel:
usertypes.JsLogLevel.error,
}
_NAVIGATION_TYPE_MAPPING = {
- QWebEnginePage.NavigationType.NavigationTypeLinkClicked:
+ webenginecore.QWebEnginePage.NavigationType.NavigationTypeLinkClicked:
usertypes.NavigationRequest.Type.link_clicked,
- QWebEnginePage.NavigationType.NavigationTypeTyped:
+ webenginecore.QWebEnginePage.NavigationType.NavigationTypeTyped:
usertypes.NavigationRequest.Type.typed,
- QWebEnginePage.NavigationType.NavigationTypeFormSubmitted:
+ webenginecore.QWebEnginePage.NavigationType.NavigationTypeFormSubmitted:
usertypes.NavigationRequest.Type.form_submitted,
- QWebEnginePage.NavigationType.NavigationTypeBackForward:
+ webenginecore.QWebEnginePage.NavigationType.NavigationTypeBackForward:
usertypes.NavigationRequest.Type.back_forward,
- QWebEnginePage.NavigationType.NavigationTypeReload:
+ webenginecore.QWebEnginePage.NavigationType.NavigationTypeReload:
usertypes.NavigationRequest.Type.reload,
- QWebEnginePage.NavigationType.NavigationTypeOther:
+ webenginecore.QWebEnginePage.NavigationType.NavigationTypeOther:
usertypes.NavigationRequest.Type.other,
- QWebEnginePage.NavigationType.NavigationTypeRedirect:
+ webenginecore.QWebEnginePage.NavigationType.NavigationTypeRedirect:
usertypes.NavigationRequest.Type.redirect,
}
@@ -212,7 +208,7 @@ class WebEnginePage(QWebEnginePage):
self._is_shutting_down = True
self.shutting_down.emit()
- @pyqtSlot(QWebEngineCertificateError)
+ @core.pyqtSlot(webenginecore.QWebEngineCertificateError)
def _handle_certificate_error(self, qt_error):
"""Handle certificate errors coming from Qt."""
error = certificateerror.create(qt_error)
@@ -259,8 +255,8 @@ class WebEnginePage(QWebEnginePage):
shared.javascript_log_message(self._JS_LOG_LEVEL_MAPPING[level], source, line, msg)
def acceptNavigationRequest(self,
- url: QUrl,
- typ: QWebEnginePage.NavigationType,
+ url: core.QUrl,
+ typ: webenginecore.QWebEnginePage.NavigationType,
is_main_frame: bool) -> bool:
"""Override acceptNavigationRequest to forward it to the tab API."""
navigation = usertypes.NavigationRequest(
@@ -273,7 +269,7 @@ class WebEnginePage(QWebEnginePage):
def chooseFiles(
self,
- mode: QWebEnginePage.FileSelectionMode,
+ mode: webenginecore.QWebEnginePage.FileSelectionMode,
old_files: Iterable[str],
accepted_mimetypes: Iterable[str],
) -> List[str]:
diff --git a/qutebrowser/browser/webkit/cache.py b/qutebrowser/browser/webkit/cache.py
index 2b5b07c46..98644fb38 100644
--- a/qutebrowser/browser/webkit/cache.py
+++ b/qutebrowser/browser/webkit/cache.py
@@ -22,7 +22,7 @@
from typing import cast
import os.path
-from qutebrowser.qt.network import QNetworkDiskCache
+from qutebrowser.qt import network
from qutebrowser.config import config
from qutebrowser.utils import utils, standarddir
@@ -31,7 +31,7 @@ from qutebrowser.utils import utils, standarddir
diskcache = cast('DiskCache', None)
-class DiskCache(QNetworkDiskCache):
+class DiskCache(network.QNetworkDiskCache):
"""Disk cache which sets correct cache dir and size."""
diff --git a/qutebrowser/browser/webkit/certificateerror.py b/qutebrowser/browser/webkit/certificateerror.py
index 553538193..4552fb5b9 100644
--- a/qutebrowser/browser/webkit/certificateerror.py
+++ b/qutebrowser/browser/webkit/certificateerror.py
@@ -21,16 +21,15 @@
from typing import Sequence, Optional
-from qutebrowser.qt.network import QSslError, QNetworkReply
-
from qutebrowser.utils import usertypes, utils, debug, jinja, urlutils
+from qutebrowser.qt import network
class CertificateErrorWrapper(usertypes.AbstractCertificateErrorWrapper):
"""A wrapper over a list of QSslErrors."""
- def __init__(self, reply: QNetworkReply, errors: Sequence[QSslError]) -> None:
+ def __init__(self, reply: network.QNetworkReply, errors: Sequence[network.QSslError]) -> None:
super().__init__()
self._reply = reply
self._errors = tuple(errors) # needs to be hashable
@@ -45,7 +44,7 @@ class CertificateErrorWrapper(usertypes.AbstractCertificateErrorWrapper):
def __repr__(self) -> str:
return utils.get_repr(
self,
- errors=[debug.qenum_key(QSslError, err.error()) for err in self._errors],
+ errors=[debug.qenum_key(network.QSslError, err.error()) for err in self._errors],
string=str(self))
def __hash__(self) -> int:
diff --git a/qutebrowser/browser/webkit/cookies.py b/qutebrowser/browser/webkit/cookies.py
index fed819cee..1dcbeef7b 100644
--- a/qutebrowser/browser/webkit/cookies.py
+++ b/qutebrowser/browser/webkit/cookies.py
@@ -21,19 +21,17 @@
from typing import Sequence
-from qutebrowser.qt.network import QNetworkCookie, QNetworkCookieJar
-from qutebrowser.qt.core import pyqtSignal, QDateTime
-
from qutebrowser.config import config
from qutebrowser.utils import utils, standarddir, objreg, log
from qutebrowser.misc import lineparser, objects
+from qutebrowser.qt import network, core
cookie_jar = None
ram_cookie_jar = None
-class RAMCookieJar(QNetworkCookieJar):
+class RAMCookieJar(network.QNetworkCookieJar):
"""An in-RAM cookie jar.
@@ -41,7 +39,7 @@ class RAMCookieJar(QNetworkCookieJar):
changed: Emitted when the cookie store was changed.
"""
- changed = pyqtSignal()
+ changed = core.pyqtSignal()
def __repr__(self):
return utils.get_repr(self, count=len(self.allCookies()))
@@ -93,9 +91,9 @@ class CookieJar(RAMCookieJar):
def parse_cookies(self):
"""Parse cookies from lineparser and store them."""
- cookies: Sequence[QNetworkCookie] = []
+ cookies: Sequence[network.QNetworkCookie] = []
for line in self._lineparser:
- line_cookies = QNetworkCookie.parseCookies(line)
+ line_cookies = network.QNetworkCookie.parseCookies(line)
cookies += line_cookies # type: ignore[operator]
self.setAllCookies(cookies)
@@ -103,7 +101,7 @@ class CookieJar(RAMCookieJar):
"""Purge expired cookies from the cookie jar."""
# Based on:
# https://doc.qt.io/archives/qt-5.5/qtwebkitexamples-webkitwidgets-browser-cookiejar-cpp.html
- now = QDateTime.currentDateTime()
+ now = core.QDateTime.currentDateTime()
cookies = [c for c in self.allCookies()
if c.isSessionCookie() or
c.expirationDate() >= now] # type: ignore[operator]
diff --git a/qutebrowser/browser/webkit/http.py b/qutebrowser/browser/webkit/http.py
index 104abf2d3..dbc862d81 100644
--- a/qutebrowser/browser/webkit/http.py
+++ b/qutebrowser/browser/webkit/http.py
@@ -25,7 +25,7 @@ import dataclasses
import os.path
from typing import Type
-from qutebrowser.qt.network import QNetworkRequest
+from qutebrowser.qt import network
from qutebrowser.utils import log, utils
@@ -191,7 +191,7 @@ def parse_content_type(reply):
A [mimetype, rest] list, or [None, None] if unset.
Rest can be None.
"""
- content_type = reply.header(QNetworkRequest.KnownHeaders.ContentTypeHeader)
+ content_type = reply.header(network.QNetworkRequest.KnownHeaders.ContentTypeHeader)
if content_type is None:
return [None, None]
if ';' in content_type:
diff --git a/qutebrowser/browser/webkit/mhtml.py b/qutebrowser/browser/webkit/mhtml.py
index 56ad4fb4f..6b9fbb8d1 100644
--- a/qutebrowser/browser/webkit/mhtml.py
+++ b/qutebrowser/browser/webkit/mhtml.py
@@ -36,7 +36,7 @@ import quopri
import dataclasses
from typing import MutableMapping, Set, Tuple, Callable
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import core
from qutebrowser.browser import downloads
from qutebrowser.browser.webkit import webkitelem
@@ -137,7 +137,7 @@ class MHTMLWriter:
self.root_content = root_content
self.content_location = content_location
self.content_type = content_type
- self._files: MutableMapping[QUrl, _File] = {}
+ self._files: MutableMapping[core.QUrl, _File] = {}
def add_file(self, location, content, content_type=None,
transfer_encoding=E_QUOPRI):
@@ -192,7 +192,7 @@ class MHTMLWriter:
return msg
-_PendingDownloadType = Set[Tuple[QUrl, downloads.AbstractDownloadItem]]
+_PendingDownloadType = Set[Tuple[core.QUrl, downloads.AbstractDownloadItem]]
class _Downloader:
@@ -259,7 +259,7 @@ class _Downloader:
else:
# Might be a local <script> tag or something else
continue
- absolute_url = web_url.resolved(QUrl(element_url))
+ absolute_url = web_url.resolved(core.QUrl(element_url))
self._fetch_url(absolute_url)
styles = web_frame.findAllElements('style')
@@ -273,14 +273,14 @@ class _Downloader:
if 'type' in style and style['type'] != 'text/css':
continue
for element_url in _get_css_imports(str(style)):
- self._fetch_url(web_url.resolved(QUrl(element_url)))
+ self._fetch_url(web_url.resolved(core.QUrl(element_url)))
# Search for references in inline styles
for element in web_frame.findAllElements('[style]'):
element = webkitelem.WebKitElement(element, tab=self.tab)
style = element['style']
for element_url in _get_css_imports(style):
- self._fetch_url(web_url.resolved(QUrl(element_url)))
+ self._fetch_url(web_url.resolved(core.QUrl(element_url)))
# Shortcut if no assets need to be downloaded, otherwise the file would
# never be saved. Also might happen if the downloads are fast enough to
@@ -366,7 +366,7 @@ class _Downloader:
css_string = item.fileobj.getvalue().decode('utf-8', 'ignore')
import_urls = _get_css_imports(css_string)
for import_url in import_urls:
- absolute_url = url.resolved(QUrl(import_url))
+ absolute_url = url.resolved(core.QUrl(import_url))
self._fetch_url(absolute_url)
encode = E_QUOPRI if mime.startswith('text/') else E_BASE64
diff --git a/qutebrowser/browser/webkit/network/networkmanager.py b/qutebrowser/browser/webkit/network/networkmanager.py
index 2bc3cad02..5498e3400 100644
--- a/qutebrowser/browser/webkit/network/networkmanager.py
+++ b/qutebrowser/browser/webkit/network/networkmanager.py
@@ -24,10 +24,6 @@ import html
import dataclasses
from typing import TYPE_CHECKING, Dict, MutableMapping, Optional, Set
-from qutebrowser.qt.core import pyqtSlot, pyqtSignal, QUrl, QByteArray
-from qutebrowser.qt.network import (QNetworkAccessManager, QNetworkReply, QSslConfiguration,
- QNetworkProxy)
-
from qutebrowser.config import config
from qutebrowser.utils import (message, log, usertypes, utils, objreg,
urlutils, debug)
@@ -38,6 +34,7 @@ from qutebrowser.browser.webkit import certificateerror, cookies, cache
from qutebrowser.browser.webkit.network import (webkitqutescheme, networkreply,
filescheme)
from qutebrowser.misc import objects
+from qutebrowser.qt import network, core
if TYPE_CHECKING:
from qutebrowser.mainwindow import prompt
@@ -52,7 +49,7 @@ class ProxyId:
"""Information identifying a proxy server."""
- type: QNetworkProxy.ProxyType
+ type: network.QNetworkProxy.ProxyType
hostname: str
port: int
@@ -103,7 +100,7 @@ def _is_secure_cipher(cipher):
def init():
"""Disable insecure SSL ciphers on old Qt versions."""
- ssl_config = QSslConfiguration.defaultConfiguration()
+ ssl_config = network.QSslConfiguration.defaultConfiguration()
default_ciphers = ssl_config.ciphers()
log.init.vdebug( # type: ignore[attr-defined]
"Default Qt ciphers: {}".format(
@@ -129,7 +126,7 @@ _SavedErrorsType = MutableMapping[
]
-class NetworkManager(QNetworkAccessManager):
+class NetworkManager(network.QNetworkAccessManager):
"""Our own QNetworkAccessManager.
@@ -154,7 +151,7 @@ class NetworkManager(QNetworkAccessManager):
shutting_down: Emitted when the QNAM is shutting down.
"""
- shutting_down = pyqtSignal()
+ shutting_down = core.pyqtSignal()
def __init__(self, *, win_id, tab_id, private, parent=None):
log.init.debug("Initializing NetworkManager")
@@ -240,7 +237,7 @@ class NetworkManager(QNetworkAccessManager):
def shutdown(self):
"""Abort all running requests."""
try:
- self.setNetworkAccessible(QNetworkAccessManager.NetworkAccessibility.NotAccessible)
+ self.setNetworkAccessible(network.QNetworkAccessManager.NetworkAccessibility.NotAccessible)
except AttributeError:
# Qt 5 only, deprecated seemingly without replacement.
pass
@@ -283,7 +280,7 @@ class NetworkManager(QNetworkAccessManager):
abort_on = self._get_abort_signals(reply)
tab = self._get_tab()
- first_party_url = QUrl() if tab is None else tab.data.last_navigation.url
+ first_party_url = core.QUrl() if tab is None else tab.data.last_navigation.url
shared.handle_certificate_error(
request_url=reply.url(),
@@ -303,7 +300,7 @@ class NetworkManager(QNetworkAccessManager):
self._accepted_ssl_errors.clear()
self._rejected_ssl_errors.clear()
- @pyqtSlot(QUrl)
+ @core.pyqtSlot(core.QUrl)
def clear_rejected_ssl_errors(self, url):
"""Clear the rejected SSL errors on a reload.
@@ -315,7 +312,7 @@ class NetworkManager(QNetworkAccessManager):
except KeyError:
pass
- @pyqtSlot('QNetworkReply*', 'QAuthenticator*')
+ @core.pyqtSlot('QNetworkReply*', 'QAuthenticator*')
def on_authentication_required(self, reply, authenticator):
"""Called when a website needs authentication."""
url = reply.url()
@@ -333,7 +330,7 @@ class NetworkManager(QNetworkAccessManager):
shared.authentication_required(url, authenticator,
abort_on=abort_on)
- @pyqtSlot('QNetworkProxy', 'QAuthenticator*')
+ @core.pyqtSlot('QNetworkProxy', 'QAuthenticator*')
def on_proxy_authentication_required(self, proxy, authenticator):
"""Called when a proxy needs authentication."""
proxy_id = ProxyId(proxy.type(), proxy.hostName(), proxy.port())
@@ -354,7 +351,7 @@ class NetworkManager(QNetworkAccessManager):
authenticator.setPassword(answer.password)
_proxy_auth_cache[proxy_id] = answer
- @pyqtSlot()
+ @core.pyqtSlot()
def on_adopted_download_destroyed(self):
"""Check if we can clean up if an adopted download was destroyed.
@@ -367,7 +364,7 @@ class NetworkManager(QNetworkAccessManager):
if self.adopted_downloads == 0:
self.deleteLater()
- @pyqtSlot(object) # DownloadItem
+ @core.pyqtSlot(object) # DownloadItem
def adopt_download(self, download):
"""Adopt a new DownloadItem."""
self.adopted_downloads += 1
@@ -384,10 +381,10 @@ class NetworkManager(QNetworkAccessManager):
if referer_header_conf == 'never':
# Note: using ''.encode('ascii') sends a header with no value,
# instead of no header at all
- req.setRawHeader(b'Referer', QByteArray())
+ req.setRawHeader(b'Referer', core.QByteArray())
elif (referer_header_conf == 'same-domain' and
not urlutils.same_domain(req.url(), current_url)):
- req.setRawHeader(b'Referer', QByteArray())
+ req.setRawHeader(b'Referer', core.QByteArray())
# If refer_header_conf is set to 'always', we leave the header
# alone as QtWebKit did set it.
except urlutils.InvalidUrlError:
@@ -410,21 +407,21 @@ class NetworkManager(QNetworkAccessManager):
proxy_error = proxymod.application_factory.get_error()
if proxy_error is not None:
return networkreply.ErrorNetworkReply(
- req, proxy_error, QNetworkReply.NetworkError.UnknownProxyError,
+ req, proxy_error, network.QNetworkReply.NetworkError.UnknownProxyError,
self)
if not req.url().isValid():
log.network.debug("Ignoring invalid requested URL: {}".format(
req.url().errorString()))
return networkreply.ErrorNetworkReply(
- req, "Invalid request URL", QNetworkReply.NetworkError.HostNotFoundError,
+ req, "Invalid request URL", network.QNetworkReply.NetworkError.HostNotFoundError,
self)
for header, value in shared.custom_headers(url=req.url()):
req.setRawHeader(header, value)
tab = self._get_tab()
- current_url = QUrl()
+ current_url = core.QUrl()
if tab is not None:
try:
current_url = tab.url()
@@ -437,11 +434,11 @@ class NetworkManager(QNetworkAccessManager):
interceptors.run(request)
if request.is_blocked:
return networkreply.ErrorNetworkReply(
- req, HOSTBLOCK_ERROR_STRING, QNetworkReply.NetworkError.ContentAccessDenied,
+ req, HOSTBLOCK_ERROR_STRING, network.QNetworkReply.NetworkError.ContentAccessDenied,
self)
if 'log-requests' in objects.debug_flags:
- operation = debug.qenum_key(QNetworkAccessManager, op)
+ operation = debug.qenum_key(network.QNetworkAccessManager, op)
operation = operation.replace('Operation', '').upper()
log.network.debug("{} {}, first-party {}".format(
operation,
diff --git a/qutebrowser/browser/webkit/network/networkreply.py b/qutebrowser/browser/webkit/network/networkreply.py
index 4fb7dfea5..b8d25d1ed 100644
--- a/qutebrowser/browser/webkit/network/networkreply.py
+++ b/qutebrowser/browser/webkit/network/networkreply.py
@@ -25,12 +25,10 @@
# pylint: disable=unnecessary-lambda
"""Special network replies.."""
+from qutebrowser.qt import network, core
-from qutebrowser.qt.network import QNetworkReply, QNetworkRequest
-from qutebrowser.qt.core import pyqtSlot, QIODevice, QByteArray, QTimer
-
-class FixedDataNetworkReply(QNetworkReply):
+class FixedDataNetworkReply(network.QNetworkReply):
"""QNetworkReply subclass for fixed data."""
@@ -49,21 +47,21 @@ class FixedDataNetworkReply(QNetworkReply):
self.setRequest(request)
self.setUrl(request.url())
- self.setOpenMode(QIODevice.OpenModeFlag.ReadOnly)
+ self.setOpenMode(core.QIODevice.OpenModeFlag.ReadOnly)
- self.setHeader(QNetworkRequest.KnownHeaders.ContentTypeHeader, mimeType)
- self.setHeader(QNetworkRequest.KnownHeaders.ContentLengthHeader,
- QByteArray.number(len(fileData)))
- self.setAttribute(QNetworkRequest.Attribute.HttpStatusCodeAttribute, 200)
- self.setAttribute(QNetworkRequest.Attribute.HttpReasonPhraseAttribute, 'OK')
+ self.setHeader(network.QNetworkRequest.KnownHeaders.ContentTypeHeader, mimeType)
+ self.setHeader(network.QNetworkRequest.KnownHeaders.ContentLengthHeader,
+ core.QByteArray.number(len(fileData)))
+ self.setAttribute(network.QNetworkRequest.Attribute.HttpStatusCodeAttribute, 200)
+ self.setAttribute(network.QNetworkRequest.Attribute.HttpReasonPhraseAttribute, 'OK')
# For some reason, a segfault will be triggered if these lambdas aren't
# there.
# pylint: disable=unnecessary-lambda
- QTimer.singleShot(0, lambda: self.metaDataChanged.emit())
- QTimer.singleShot(0, lambda: self.readyRead.emit())
- QTimer.singleShot(0, lambda: self.finished.emit())
+ core.QTimer.singleShot(0, lambda: self.metaDataChanged.emit())
+ core.QTimer.singleShot(0, lambda: self.readyRead.emit())
+ core.QTimer.singleShot(0, lambda: self.finished.emit())
- @pyqtSlot()
+ @core.pyqtSlot()
def abort(self):
"""Abort the operation."""
@@ -96,7 +94,7 @@ class FixedDataNetworkReply(QNetworkReply):
return False
-class ErrorNetworkReply(QNetworkReply):
+class ErrorNetworkReply(network.QNetworkReply):
"""QNetworkReply which always returns an error."""
@@ -114,10 +112,10 @@ class ErrorNetworkReply(QNetworkReply):
self.setUrl(req.url())
# We don't actually want to read anything, but we still need to open
# the device to avoid getting a warning.
- self.setOpenMode(QIODevice.OpenModeFlag.ReadOnly)
+ self.setOpenMode(core.QIODevice.OpenModeFlag.ReadOnly)
self.setError(error, errorstring)
- QTimer.singleShot(0, lambda: self.errorOccurred.emit(error))
- QTimer.singleShot(0, lambda: self.finished.emit())
+ core.QTimer.singleShot(0, lambda: self.errorOccurred.emit(error))
+ core.QTimer.singleShot(0, lambda: self.finished.emit())
def abort(self):
"""Do nothing since it's a fake reply."""
@@ -137,14 +135,14 @@ class ErrorNetworkReply(QNetworkReply):
return False
-class RedirectNetworkReply(QNetworkReply):
+class RedirectNetworkReply(network.QNetworkReply):
"""A reply which redirects to the given URL."""
def __init__(self, new_url, parent=None):
super().__init__(parent)
- self.setAttribute(QNetworkRequest.Attribute.RedirectionTargetAttribute, new_url)
- QTimer.singleShot(0, lambda: self.finished.emit())
+ self.setAttribute(network.QNetworkRequest.Attribute.RedirectionTargetAttribute, new_url)
+ core.QTimer.singleShot(0, lambda: self.finished.emit())
def abort(self):
"""Called when there's e.g. a redirection limit."""
diff --git a/qutebrowser/browser/webkit/network/webkitqutescheme.py b/qutebrowser/browser/webkit/network/webkitqutescheme.py
index 0c4da1a84..29b15ea3d 100644
--- a/qutebrowser/browser/webkit/network/webkitqutescheme.py
+++ b/qutebrowser/browser/webkit/network/webkitqutescheme.py
@@ -19,8 +19,7 @@
"""QtWebKit specific qute://* handlers and glue code."""
-from qutebrowser.qt.core import QUrl
-from qutebrowser.qt.network import QNetworkReply, QNetworkAccessManager
+from qutebrowser.qt import network, core
from qutebrowser.browser import qutescheme
from qutebrowser.browser.webkit.network import networkreply
@@ -38,37 +37,37 @@ def handler(request, operation, current_url):
Return:
A QNetworkReply.
"""
- if operation != QNetworkAccessManager.Operation.GetOperation:
+ if operation != network.QNetworkAccessManager.Operation.GetOperation:
return networkreply.ErrorNetworkReply(
request, "Unsupported request type",
- QNetworkReply.NetworkError.ContentOperationNotPermittedError)
+ network.QNetworkReply.NetworkError.ContentOperationNotPermittedError)
url = request.url()
if ((url.scheme(), url.host(), url.path()) ==
('qute', 'settings', '/set')):
- if current_url != QUrl('qute://settings/'):
+ if current_url != core.QUrl('qute://settings/'):
log.network.warning("Blocking malicious request from {} to {}"
.format(current_url.toDisplayString(),
url.toDisplayString()))
return networkreply.ErrorNetworkReply(
request, "Invalid qute://settings request",
- QNetworkReply.NetworkError.ContentAccessDenied)
+ network.QNetworkReply.NetworkError.ContentAccessDenied)
try:
mimetype, data = qutescheme.data_for_url(url)
except qutescheme.Error as e:
errors = {
qutescheme.NotFoundError:
- QNetworkReply.NetworkError.ContentNotFoundError,
+ network.QNetworkReply.NetworkError.ContentNotFoundError,
qutescheme.UrlInvalidError:
- QNetworkReply.NetworkError.ContentOperationNotPermittedError,
+ network.QNetworkReply.NetworkError.ContentOperationNotPermittedError,
qutescheme.RequestDeniedError:
- QNetworkReply.NetworkError.ContentAccessDenied,
+ network.QNetworkReply.NetworkError.ContentAccessDenied,
qutescheme.SchemeOSError:
- QNetworkReply.NetworkError.ContentNotFoundError,
+ network.QNetworkReply.NetworkError.ContentNotFoundError,
qutescheme.Error:
- QNetworkReply.NetworkError.InternalServerError,
+ network.QNetworkReply.NetworkError.InternalServerError,
}
exctype = type(e)
log.misc.error("{} while handling qute://* URL".format(
diff --git a/qutebrowser/browser/webkit/tabhistory.py b/qutebrowser/browser/webkit/tabhistory.py
index 183ffc7a9..3af32c4ad 100644
--- a/qutebrowser/browser/webkit/tabhistory.py
+++ b/qutebrowser/browser/webkit/tabhistory.py
@@ -21,9 +21,8 @@
from typing import Any, List, Mapping
-from qutebrowser.qt.core import QByteArray, QDataStream, QIODevice, QUrl
-
from qutebrowser.utils import qtutils
+from qutebrowser.qt import core
def _serialize_items(items, current_idx, stream):
@@ -50,10 +49,10 @@ def _serialize_items(items, current_idx, stream):
def _serialize_item(item):
data = {
- 'originalURLString': item.original_url.toString(QUrl.ComponentFormattingOption.FullyEncoded),
+ 'originalURLString': item.original_url.toString(core.QUrl.ComponentFormattingOption.FullyEncoded),
'scrollPosition': {'x': 0, 'y': 0},
'title': item.title,
- 'urlString': item.url.toString(QUrl.ComponentFormattingOption.FullyEncoded),
+ 'urlString': item.url.toString(core.QUrl.ComponentFormattingOption.FullyEncoded),
}
try:
data['scrollPosition']['x'] = item.user_data['scroll-pos'].x()
@@ -79,8 +78,8 @@ def serialize(items):
If 'data' goes out of scope, reading from 'stream' will result in a
segfault!
"""
- data = QByteArray()
- stream = QDataStream(data, QIODevice.OpenModeFlag.ReadWrite)
+ data = core.QByteArray()
+ stream = core.QDataStream(data, core.QIODevice.OpenModeFlag.ReadWrite)
user_data: List[Mapping[str, Any]] = []
current_idx = None
diff --git a/qutebrowser/browser/webkit/webkitelem.py b/qutebrowser/browser/webkit/webkitelem.py
index c44f675e7..1a41ea060 100644
--- a/qutebrowser/browser/webkit/webkitelem.py
+++ b/qutebrowser/browser/webkit/webkitelem.py
@@ -23,14 +23,12 @@
"""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
-from qutebrowser.qt.webkit import QWebElement, QWebSettings
-from qutebrowser.qt.webkitwidgets import QWebFrame
+from qutebrowser.qt import webkitwidgets
from qutebrowser.config import config
from qutebrowser.utils import log, utils, javascript, usertypes
from qutebrowser.browser import webelem
+from qutebrowser.qt import webkit, core
if TYPE_CHECKING:
from qutebrowser.browser.webkit import webkittab
@@ -47,7 +45,7 @@ class WebKitElement(webelem.AbstractWebElement):
_tab: 'webkittab.WebKitTab'
- def __init__(self, elem: QWebElement, tab: 'webkittab.WebKitTab') -> None:
+ def __init__(self, elem: webkit.QWebElement, tab: 'webkittab.WebKitTab') -> None:
super().__init__(tab)
if isinstance(elem, self.__class__):
raise TypeError("Trying to wrap a wrapper!")
@@ -102,7 +100,7 @@ class WebKitElement(webelem.AbstractWebElement):
self._check_vanished()
return self._elem.webFrame() is not None
- def geometry(self) -> QRect:
+ def geometry(self) -> core.QRect:
self._check_vanished()
return self._elem.geometry()
@@ -182,13 +180,13 @@ class WebKitElement(webelem.AbstractWebElement):
def _parent(self) -> Optional['WebKitElement']:
"""Get the parent element of this element."""
self._check_vanished()
- elem = cast(Optional[QWebElement], self._elem.parent())
+ elem = cast(Optional[webkit.QWebElement], self._elem.parent())
if elem is None or elem.isNull():
return None
return WebKitElement(elem, tab=self._tab)
- def _rect_on_view_js(self) -> Optional[QRect]:
+ def _rect_on_view_js(self) -> Optional[core.QRect]:
"""Javascript implementation for rect_on_view."""
# FIXME:qtwebengine maybe we can reuse this?
rects = self._elem.evaluateJavaScript("this.getClientRects()")
@@ -215,10 +213,10 @@ class WebKitElement(webelem.AbstractWebElement):
rect["top"] *= zoom
width *= zoom
height *= zoom
- rect = QRect(int(rect["left"]), int(rect["top"]),
+ rect = core.QRect(int(rect["left"]), int(rect["top"]),
int(width), int(height))
- frame = cast(Optional[QWebFrame], self._elem.webFrame())
+ frame = cast(Optional[webkitwidgets.QWebFrame], self._elem.webFrame())
while frame is not None:
# Translate to parent frames' position (scroll position
# is taken care of inside getClientRects)
@@ -229,24 +227,24 @@ class WebKitElement(webelem.AbstractWebElement):
return None
- def _rect_on_view_python(self, elem_geometry: Optional[QRect]) -> QRect:
+ def _rect_on_view_python(self, elem_geometry: Optional[core.QRect]) -> core.QRect:
"""Python implementation for rect_on_view."""
if elem_geometry is None:
geometry = self._elem.geometry()
else:
geometry = elem_geometry
- rect = QRect(geometry)
+ rect = core.QRect(geometry)
- frame = cast(Optional[QWebFrame], self._elem.webFrame())
+ frame = cast(Optional[webkitwidgets.QWebFrame], self._elem.webFrame())
while frame is not None:
rect.translate(frame.geometry().topLeft())
rect.translate(frame.scrollPosition() * -1)
- frame = cast(Optional[QWebFrame], frame.parentFrame())
+ frame = cast(Optional[webkitwidgets.QWebFrame], frame.parentFrame())
return rect
- def rect_on_view(self, *, elem_geometry: QRect = None,
- no_js: bool = False) -> QRect:
+ def rect_on_view(self, *, elem_geometry: core.QRect = None,
+ no_js: bool = False) -> core.QRect:
"""Get the geometry of the element relative to the webview.
Uses the getClientRects() JavaScript method to obtain the collection of
@@ -279,7 +277,7 @@ class WebKitElement(webelem.AbstractWebElement):
def _is_hidden_css(self) -> bool:
"""Check if the given element is hidden via CSS."""
attr_values = {
- attr: self._elem.styleProperty(attr, QWebElement.StyleResolveStrategy.ComputedStyle)
+ attr: self._elem.styleProperty(attr, webkit.QWebElement.StyleResolveStrategy.ComputedStyle)
for attr in ['visibility', 'display', 'opacity']
}
invisible = attr_values['visibility'] == 'hidden'
@@ -290,7 +288,7 @@ class WebKitElement(webelem.AbstractWebElement):
'custom-control-input' in self.classes())
return invisible or none_display or (zero_opacity and not is_framework)
- def _is_visible(self, mainframe: QWebFrame) -> bool:
+ def _is_visible(self, mainframe: webkitwidgets.QWebFrame) -> bool:
"""Check if the given element is visible in the given frame.
This is not public API because it can't be implemented easily here with
@@ -318,7 +316,7 @@ class WebKitElement(webelem.AbstractWebElement):
# Then check if it's visible in its frame if it's not in the main
# frame.
elem_frame = self._elem.webFrame()
- framegeom = QRect(elem_frame.geometry())
+ framegeom = core.QRect(elem_frame.geometry())
if not framegeom.isValid():
visible_in_frame = False
elif elem_frame.parentFrame() is not None:
@@ -364,8 +362,8 @@ class WebKitElement(webelem.AbstractWebElement):
self._click_fake_event(click_target)
def _click_js(self, click_target: usertypes.ClickTarget) -> None:
- settings = QWebSettings.globalSettings()
- attribute = QWebSettings.WebAttribute.JavascriptCanOpenWindows
+ settings = webkit.QWebSettings.globalSettings()
+ attribute = webkit.QWebSettings.WebAttribute.JavascriptCanOpenWindows
could_open_windows = settings.testAttribute(attribute)
settings.setAttribute(attribute, True)
ok = self._elem.evaluateJavaScript('this.click(); true;')
@@ -375,12 +373,12 @@ class WebKitElement(webelem.AbstractWebElement):
self._click_fake_event(click_target)
def _click_fake_event(self, click_target: usertypes.ClickTarget,
- button: Qt.MouseButton = Qt.MouseButton.LeftButton) -> None:
+ button: core.Qt.MouseButton = core.Qt.MouseButton.LeftButton) -> None:
self._tab.data.override_target = click_target
super()._click_fake_event(click_target)
-def get_child_frames(startframe: QWebFrame) -> List[QWebFrame]:
+def get_child_frames(startframe: webkitwidgets.QWebFrame) -> List[webkitwidgets.QWebFrame]:
"""Get all children recursively of a given QWebFrame.
Loosely based on https://blog.nextgenetics.net/?e=64
@@ -394,7 +392,7 @@ def get_child_frames(startframe: QWebFrame) -> List[QWebFrame]:
results = []
frames = [startframe]
while frames:
- new_frames: List[QWebFrame] = []
+ new_frames: List[webkitwidgets.QWebFrame] = []
for frame in frames:
results.append(frame)
new_frames += frame.childFrames()
diff --git a/qutebrowser/browser/webkit/webkithistory.py b/qutebrowser/browser/webkit/webkithistory.py
index 549a4d545..2a73b8126 100644
--- a/qutebrowser/browser/webkit/webkithistory.py
+++ b/qutebrowser/browser/webkit/webkithistory.py
@@ -24,13 +24,13 @@
import functools
-from qutebrowser.qt.webkit import QWebHistoryInterface
+from qutebrowser.qt import webkit
from qutebrowser.utils import debug
from qutebrowser.misc import debugcachestats
-class WebHistoryInterface(QWebHistoryInterface):
+class WebHistoryInterface(webkit.QWebHistoryInterface):
"""Glue code between WebHistory and Qt's QWebHistoryInterface.
@@ -68,4 +68,4 @@ def init(history):
history: The WebHistory object.
"""
interface = WebHistoryInterface(history, parent=history)
- QWebHistoryInterface.setDefaultInterface(interface)
+ webkit.QWebHistoryInterface.setDefaultInterface(interface)
diff --git a/qutebrowser/browser/webkit/webkitinspector.py b/qutebrowser/browser/webkit/webkitinspector.py
index 69e1c7e24..a2a5104ec 100644
--- a/qutebrowser/browser/webkit/webkitinspector.py
+++ b/qutebrowser/browser/webkit/webkitinspector.py
@@ -22,9 +22,7 @@
"""Customized QWebInspector for QtWebKit."""
-from qutebrowser.qt.webkit import QWebSettings
-from qutebrowser.qt.webkitwidgets import QWebInspector, QWebPage
-from qutebrowser.qt.widgets import QWidget
+from qutebrowser.qt import widgets, webkitwidgets, webkit
from qutebrowser.browser import inspector
from qutebrowser.misc import miscwidgets
@@ -36,12 +34,12 @@ class WebKitInspector(inspector.AbstractWebInspector):
def __init__(self, splitter: miscwidgets.InspectorSplitter,
win_id: int,
- parent: QWidget = None) -> None:
+ parent: widgets.QWidget = None) -> None:
super().__init__(splitter, win_id, parent)
- qwebinspector = QWebInspector()
+ qwebinspector = webkitwidgets.QWebInspector()
self._set_widget(qwebinspector)
- def inspect(self, page: QWebPage) -> None:
- settings = QWebSettings.globalSettings()
- settings.setAttribute(QWebSettings.WebAttribute.DeveloperExtrasEnabled, True)
+ def inspect(self, page: webkitwidgets.QWebPage) -> None:
+ settings = webkit.QWebSettings.globalSettings()
+ settings.setAttribute(webkit.QWebSettings.WebAttribute.DeveloperExtrasEnabled, True)
self._widget.setPage(page)
diff --git a/qutebrowser/browser/webkit/webkitsettings.py b/qutebrowser/browser/webkit/webkitsettings.py
index 87dc30327..acbf8096a 100644
--- a/qutebrowser/browser/webkit/webkitsettings.py
+++ b/qutebrowser/browser/webkit/webkitsettings.py
@@ -30,10 +30,7 @@ Module attributes:
from typing import cast
import os.path
-from qutebrowser.qt.core import QUrl
-from qutebrowser.qt.gui import QFont
-from qutebrowser.qt.webkit import QWebSettings
-from qutebrowser.qt.webkitwidgets import QWebPage
+from qutebrowser.qt import webkitwidgets, webkit, gui, core
from qutebrowser.config import config, websettings
from qutebrowser.config.websettings import AttributeInfo as Attr
@@ -53,82 +50,82 @@ class WebKitSettings(websettings.AbstractSettings):
_ATTRIBUTES = {
'content.images':
- Attr(QWebSettings.WebAttribute.AutoLoadImages),
+ Attr(webkit.QWebSettings.WebAttribute.AutoLoadImages),
'content.javascript.enabled':
- Attr(QWebSettings.WebAttribute.JavascriptEnabled),
+ Attr(webkit.QWebSettings.WebAttribute.JavascriptEnabled),
'content.javascript.can_open_tabs_automatically':
- Attr(QWebSettings.WebAttribute.JavascriptCanOpenWindows),
+ Attr(webkit.QWebSettings.WebAttribute.JavascriptCanOpenWindows),
'content.javascript.can_close_tabs':
- Attr(QWebSettings.WebAttribute.JavascriptCanCloseWindows),
+ Attr(webkit.QWebSettings.WebAttribute.JavascriptCanCloseWindows),
'content.javascript.clipboard':
- Attr(QWebSettings.WebAttribute.JavascriptCanAccessClipboard,
+ Attr(webkit.QWebSettings.WebAttribute.JavascriptCanAccessClipboard,
converter=lambda val: val != "none"),
'content.plugins':
- Attr(QWebSettings.WebAttribute.PluginsEnabled),
+ Attr(webkit.QWebSettings.WebAttribute.PluginsEnabled),
'content.webgl':
- Attr(QWebSettings.WebAttribute.WebGLEnabled),
+ Attr(webkit.QWebSettings.WebAttribute.WebGLEnabled),
'content.hyperlink_auditing':
- Attr(QWebSettings.WebAttribute.HyperlinkAuditingEnabled),
+ Attr(webkit.QWebSettings.WebAttribute.HyperlinkAuditingEnabled),
'content.local_content_can_access_remote_urls':
- Attr(QWebSettings.WebAttribute.LocalContentCanAccessRemoteUrls),
+ Attr(webkit.QWebSettings.WebAttribute.LocalContentCanAccessRemoteUrls),
'content.local_content_can_access_file_urls':
- Attr(QWebSettings.WebAttribute.LocalContentCanAccessFileUrls),
+ Attr(webkit.QWebSettings.WebAttribute.LocalContentCanAccessFileUrls),
'content.dns_prefetch':
- Attr(QWebSettings.WebAttribute.DnsPrefetchEnabled),
+ Attr(webkit.QWebSettings.WebAttribute.DnsPrefetchEnabled),
'content.frame_flattening':
- Attr(QWebSettings.WebAttribute.FrameFlatteningEnabled),
+ Attr(webkit.QWebSettings.WebAttribute.FrameFlatteningEnabled),
'content.cache.appcache':
- Attr(QWebSettings.WebAttribute.OfflineWebApplicationCacheEnabled),
+ Attr(webkit.QWebSettings.WebAttribute.OfflineWebApplicationCacheEnabled),
'content.local_storage':
- Attr(QWebSettings.WebAttribute.LocalStorageEnabled,
- QWebSettings.WebAttribute.OfflineStorageDatabaseEnabled),
+ Attr(webkit.QWebSettings.WebAttribute.LocalStorageEnabled,
+ webkit.QWebSettings.WebAttribute.OfflineStorageDatabaseEnabled),
'content.print_element_backgrounds':
- Attr(QWebSettings.WebAttribute.PrintElementBackgrounds),
+ Attr(webkit.QWebSettings.WebAttribute.PrintElementBackgrounds),
'content.xss_auditing':
- Attr(QWebSettings.WebAttribute.XSSAuditingEnabled),
+ Attr(webkit.QWebSettings.WebAttribute.XSSAuditingEnabled),
'content.site_specific_quirks.enabled':
- Attr(QWebSettings.WebAttribute.SiteSpecificQuirksEnabled),
+ Attr(webkit.QWebSettings.WebAttribute.SiteSpecificQuirksEnabled),
'input.spatial_navigation':
- Attr(QWebSettings.WebAttribute.SpatialNavigationEnabled),
+ Attr(webkit.QWebSettings.WebAttribute.SpatialNavigationEnabled),
'input.links_included_in_focus_chain':
- Attr(QWebSettings.WebAttribute.LinksIncludedInFocusChain),
+ Attr(webkit.QWebSettings.WebAttribute.LinksIncludedInFocusChain),
'zoom.text_only':
- Attr(QWebSettings.WebAttribute.ZoomTextOnly),
+ Attr(webkit.QWebSettings.WebAttribute.ZoomTextOnly),
'scrolling.smooth':
- Attr(QWebSettings.WebAttribute.ScrollAnimatorEnabled),
+ Attr(webkit.QWebSettings.WebAttribute.ScrollAnimatorEnabled),
}
_FONT_SIZES = {
'fonts.web.size.minimum':
- QWebSettings.FontSize.MinimumFontSize,
+ webkit.QWebSettings.FontSize.MinimumFontSize,
'fonts.web.size.minimum_logical':
- QWebSettings.FontSize.MinimumLogicalFontSize,
+ webkit.QWebSettings.FontSize.MinimumLogicalFontSize,
'fonts.web.size.default':
- QWebSettings.FontSize.DefaultFontSize,
+ webkit.QWebSettings.FontSize.DefaultFontSize,
'fonts.web.size.default_fixed':
- QWebSettings.FontSize.DefaultFixedFontSize,
+ webkit.QWebSettings.FontSize.DefaultFixedFontSize,
}
_FONT_FAMILIES = {
- 'fonts.web.family.standard': QWebSettings.FontFamily.StandardFont,
- 'fonts.web.family.fixed': QWebSettings.FontFamily.FixedFont,
- 'fonts.web.family.serif': QWebSettings.FontFamily.SerifFont,
- 'fonts.web.family.sans_serif': QWebSettings.FontFamily.SansSerifFont,
- 'fonts.web.family.cursive': QWebSettings.FontFamily.CursiveFont,
- 'fonts.web.family.fantasy': QWebSettings.FontFamily.FantasyFont,
+ 'fonts.web.family.standard': webkit.QWebSettings.FontFamily.StandardFont,
+ 'fonts.web.family.fixed': webkit.QWebSettings.FontFamily.FixedFont,
+ 'fonts.web.family.serif': webkit.QWebSettings.FontFamily.SerifFont,
+ 'fonts.web.family.sans_serif': webkit.QWebSettings.FontFamily.SansSerifFont,
+ 'fonts.web.family.cursive': webkit.QWebSettings.FontFamily.CursiveFont,
+ 'fonts.web.family.fantasy': webkit.QWebSettings.FontFamily.FantasyFont,
}
# Mapping from QWebSettings::QWebSettings() in
# qtwebkit/Source/WebKit/qt/Api/qwebsettings.cpp
_FONT_TO_QFONT = {
- QWebSettings.FontFamily.StandardFont: QFont.StyleHint.Serif,
- QWebSettings.FontFamily.FixedFont: QFont.StyleHint.Monospace,
- QWebSettings.FontFamily.SerifFont: QFont.StyleHint.Serif,
- QWebSettings.FontFamily.SansSerifFont: QFont.StyleHint.SansSerif,
- QWebSettings.FontFamily.CursiveFont: QFont.StyleHint.Cursive,
- QWebSettings.FontFamily.FantasyFont: QFont.StyleHint.Fantasy,
+ webkit.QWebSettings.FontFamily.StandardFont: gui.QFont.StyleHint.Serif,
+ webkit.QWebSettings.FontFamily.FixedFont: gui.QFont.StyleHint.Monospace,
+ webkit.QWebSettings.FontFamily.SerifFont: gui.QFont.StyleHint.Serif,
+ webkit.QWebSettings.FontFamily.SansSerifFont: gui.QFont.StyleHint.SansSerif,
+ webkit.QWebSettings.FontFamily.CursiveFont: gui.QFont.StyleHint.Cursive,
+ webkit.QWebSettings.FontFamily.FantasyFont: gui.QFont.StyleHint.Fantasy,
}
@@ -142,10 +139,10 @@ def _set_user_stylesheet(settings):
def _set_cookie_accept_policy(settings):
"""Update the content.cookies.accept setting."""
mapping = {
- 'all': QWebSettings.ThirdPartyCookiePolicy.AlwaysAllowThirdPartyCookies,
- 'no-3rdparty': QWebSettings.ThirdPartyCookiePolicy.AlwaysBlockThirdPartyCookies,
- 'never': QWebSettings.ThirdPartyCookiePolicy.AlwaysBlockThirdPartyCookies,
- 'no-unknown-3rdparty': QWebSettings.ThirdPartyCookiePolicy.AllowThirdPartyWithExistingCookies,
+ 'all': webkit.QWebSettings.ThirdPartyCookiePolicy.AlwaysAllowThirdPartyCookies,
+ 'no-3rdparty': webkit.QWebSettings.ThirdPartyCookiePolicy.AlwaysBlockThirdPartyCookies,
+ 'never': webkit.QWebSettings.ThirdPartyCookiePolicy.AlwaysBlockThirdPartyCookies,
+ 'no-unknown-3rdparty': webkit.QWebSettings.ThirdPartyCookiePolicy.AllowThirdPartyWithExistingCookies,
}
value = config.val.content.cookies.accept
settings.setThirdPartyCookiePolicy(mapping[value])
@@ -161,7 +158,7 @@ def _update_settings(option):
"""Update global settings when qwebsettings changed."""
global_settings.update_setting(option)
- settings = QWebSettings.globalSettings()
+ settings = webkit.QWebSettings.globalSettings()
if option in ['scrollbar.hide', 'content.user_stylesheets']:
_set_user_stylesheet(settings)
elif option == 'content.cookies.accept':
@@ -172,7 +169,7 @@ def _update_settings(option):
def _init_user_agent():
global parsed_user_agent
- ua = QWebPage().userAgentForUrl(QUrl())
+ ua = webkitwidgets.QWebPage().userAgentForUrl(core.QUrl())
parsed_user_agent = websettings.UserAgent.parse(ua)
@@ -181,15 +178,15 @@ def init():
cache_path = standarddir.cache()
data_path = standarddir.data()
- QWebSettings.setIconDatabasePath(standarddir.cache())
- QWebSettings.setOfflineWebApplicationCachePath(
+ webkit.QWebSettings.setIconDatabasePath(standarddir.cache())
+ webkit.QWebSettings.setOfflineWebApplicationCachePath(
os.path.join(cache_path, 'application-cache'))
- QWebSettings.globalSettings().setLocalStoragePath(
+ webkit.QWebSettings.globalSettings().setLocalStoragePath(
os.path.join(data_path, 'local-storage'))
- QWebSettings.setOfflineStoragePath(
+ webkit.QWebSettings.setOfflineStoragePath(
os.path.join(data_path, 'offline-storage'))
- settings = QWebSettings.globalSettings()
+ settings = webkit.QWebSettings.globalSettings()
_set_user_stylesheet(settings)
_set_cookie_accept_policy(settings)
_set_cache_maximum_pages(settings)
@@ -199,12 +196,12 @@ def init():
config.instance.changed.connect(_update_settings)
global global_settings
- global_settings = WebKitSettings(QWebSettings.globalSettings())
+ global_settings = WebKitSettings(webkit.QWebSettings.globalSettings())
global_settings.init_settings()
def shutdown():
"""Disable storage so removing tmpdir will work."""
- QWebSettings.setIconDatabasePath('')
- QWebSettings.setOfflineWebApplicationCachePath('')
- QWebSettings.globalSettings().setLocalStoragePath('')
+ webkit.QWebSettings.setIconDatabasePath('')
+ webkit.QWebSettings.setOfflineWebApplicationCachePath('')
+ webkit.QWebSettings.globalSettings().setLocalStoragePath('')
diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py
index 0916a0a64..d30c3cb71 100644
--- a/qutebrowser/browser/webkit/webkittab.py
+++ b/qutebrowser/browser/webkit/webkittab.py
@@ -26,13 +26,7 @@ import re
import functools
import xml.etree.ElementTree
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
-from qutebrowser.qt.webkitwidgets import QWebPage, QWebFrame
-from qutebrowser.qt.webkit import QWebSettings, QWebHistory, QWebElement
-from qutebrowser.qt.printsupport import QPrinter
+from qutebrowser.qt import widgets, webkitwidgets, webkit, printsupport, gui
from qutebrowser.browser import browsertab, shared
from qutebrowser.browser.webkit import (webview, webpage, tabhistory, webkitelem,
@@ -40,14 +34,14 @@ from qutebrowser.browser.webkit import (webview, webpage, tabhistory, webkitelem
from qutebrowser.browser.webkit.network import networkmanager
from qutebrowser.utils import qtutils, usertypes, utils, log, debug, resources
from qutebrowser.keyinput import modeman
-from qutebrowser.qt import sip
+from qutebrowser.qt import core, sip
class WebKitAction(browsertab.AbstractAction):
"""QtWebKit implementations related to web actions."""
- action_base = QWebPage.WebAction
+ action_base = webkitwidgets.QWebPage.WebAction
_widget: webview.WebView
@@ -69,9 +63,9 @@ class WebKitAction(browsertab.AbstractAction):
"""
new_actions = {
# https://github.com/qtwebkit/qtwebkit/commit/a96d9ef5d24b02d996ad14ff050d0e485c9ddc97
- 'RequestClose': QWebPage.WebAction.ToggleVideoFullscreen + 1,
+ 'RequestClose': webkitwidgets.QWebPage.WebAction.ToggleVideoFullscreen + 1,
# https://github.com/qtwebkit/qtwebkit/commit/96b9ba6269a5be44343635a7aaca4a153ea0366b
- 'Unselect': QWebPage.WebAction.ToggleVideoFullscreen + 2,
+ 'Unselect': webkitwidgets.QWebPage.WebAction.ToggleVideoFullscreen + 2,
}
if name in new_actions:
self._widget.triggerPageAction(new_actions[name]) # type: ignore[arg-type]
@@ -93,7 +87,7 @@ class WebKitPrinting(browsertab.AbstractPrinting):
pass
def to_pdf(self, filename):
- printer = QPrinter()
+ printer = printsupport.QPrinter()
printer.setOutputFileName(filename)
self._widget.print(printer)
# Can't find out whether there was an error...
@@ -116,14 +110,14 @@ class WebKitSearch(browsertab.AbstractSearch):
self._flags = self._empty_flags()
def _empty_flags(self):
- return QWebPage.FindFlags(0) # type: ignore[call-overload]
+ return webkitwidgets.QWebPage.FindFlags(0) # type: ignore[call-overload]
def _args_to_flags(self, reverse, ignore_case):
flags = self._empty_flags()
if self._is_case_sensitive(ignore_case):
- flags |= QWebPage.FindFlag.FindCaseSensitively
+ flags |= webkitwidgets.QWebPage.FindFlag.FindCaseSensitively
if reverse:
- flags |= QWebPage.FindFlag.FindBackward
+ flags |= webkitwidgets.QWebPage.FindFlag.FindBackward
return flags
def _call_cb(self, callback, found, text, flags, caller):
@@ -142,8 +136,8 @@ class WebKitSearch(browsertab.AbstractSearch):
# Removing FindWrapsAroundDocument to get the same logging as with
# QtWebEngine
debug_flags = debug.qflags_key(
- QWebPage, flags & ~QWebPage.FindFlag.FindWrapsAroundDocument,
- klass=QWebPage.FindFlag)
+ webkitwidgets.QWebPage, flags & ~webkitwidgets.QWebPage.FindFlag.FindWrapsAroundDocument,
+ klass=webkitwidgets.QWebPage.FindFlag)
if debug_flags != '0x0000':
flag_text = 'with flags {}'.format(debug_flags)
else:
@@ -155,7 +149,7 @@ class WebKitSearch(browsertab.AbstractSearch):
if found:
# no wrapping detection
cb_value = browsertab.SearchNavigationResult.found
- elif flags & QWebPage.FindBackward:
+ elif flags & webkitwidgets.QWebPage.FindBackward:
cb_value = browsertab.SearchNavigationResult.wrap_prevented_top
else:
cb_value = browsertab.SearchNavigationResult.wrap_prevented_bottom
@@ -163,7 +157,7 @@ class WebKitSearch(browsertab.AbstractSearch):
cb_value = found
else:
raise utils.Unreachable(caller)
- QTimer.singleShot(0, functools.partial(callback, cb_value))
+ core.QTimer.singleShot(0, functools.partial(callback, cb_value))
self.finished.emit(found)
@@ -174,7 +168,7 @@ class WebKitSearch(browsertab.AbstractSearch):
# We first clear the marked text, then the highlights
self._widget.findText('')
self._widget.findText(
- '', QWebPage.FindFlag.HighlightAllOccurrences) # type: ignore[arg-type]
+ '', webkitwidgets.QWebPage.FindFlag.HighlightAllOccurrences) # type: ignore[arg-type]
def search(self, text, *, ignore_case=usertypes.IgnoreCase.never,
reverse=False, result_cb=None):
@@ -195,17 +189,17 @@ class WebKitSearch(browsertab.AbstractSearch):
# to get a mark so we can navigate.
found = self._widget.findText(text, self._flags)
self._widget.findText(text,
- self._flags | QWebPage.FindFlag.HighlightAllOccurrences)
+ self._flags | webkitwidgets.QWebPage.FindFlag.HighlightAllOccurrences)
self._call_cb(result_cb, found, text, self._flags, 'search')
def next_result(self, *, wrap=False, callback=None):
self.search_displayed = True
# The int() here makes sure we get a copy of the flags.
- flags = QWebPage.FindFlags(
+ flags = webkitwidgets.QWebPage.FindFlags(
int(self._flags)) # type: ignore[call-overload]
if wrap:
- flags |= QWebPage.FindFlag.FindWrapsAroundDocument
+ flags |= webkitwidgets.QWebPage.FindFlag.FindWrapsAroundDocument
found = self._widget.findText(self.text, flags) # type: ignore[arg-type]
self._call_cb(callback, found, self.text, flags, 'next_result')
@@ -213,16 +207,16 @@ class WebKitSearch(browsertab.AbstractSearch):
def prev_result(self, *, wrap=False, callback=None):
self.search_displayed = True
# The int() here makes sure we get a copy of the flags.
- flags = QWebPage.FindFlags(
+ flags = webkitwidgets.QWebPage.FindFlags(
int(self._flags)) # type: ignore[call-overload]
- if flags & QWebPage.FindFlag.FindBackward:
- flags &= ~QWebPage.FindFlag.FindBackward
+ if flags & webkitwidgets.QWebPage.FindFlag.FindBackward:
+ flags &= ~webkitwidgets.QWebPage.FindFlag.FindBackward
else:
- flags |= QWebPage.FindFlag.FindBackward
+ flags |= webkitwidgets.QWebPage.FindFlag.FindBackward
if wrap:
- flags |= QWebPage.FindFlag.FindWrapsAroundDocument
+ flags |= webkitwidgets.QWebPage.FindFlag.FindWrapsAroundDocument
found = self._widget.findText(self.text, flags) # type: ignore[arg-type]
self._call_cb(callback, found, self.text, flags, 'prev_result')
@@ -237,11 +231,11 @@ class WebKitCaret(browsertab.AbstractCaret):
def __init__(self,
tab: 'WebKitTab',
mode_manager: modeman.ModeManager,
- parent: QWidget = None) -> None:
+ parent: widgets.QWidget = None) -> None:
super().__init__(tab, mode_manager, parent)
self._selection_state = browsertab.SelectionState.none
- @pyqtSlot(usertypes.KeyMode)
+ @core.pyqtSlot(usertypes.KeyMode)
def _on_mode_entered(self, mode):
if mode != usertypes.KeyMode.caret:
return
@@ -252,13 +246,13 @@ class WebKitCaret(browsertab.AbstractCaret):
self._selection_state = browsertab.SelectionState.none
self.selection_toggled.emit(self._selection_state)
settings = self._widget.settings()
- settings.setAttribute(QWebSettings.WebAttribute.CaretBrowsingEnabled, True)
+ settings.setAttribute(webkit.QWebSettings.WebAttribute.CaretBrowsingEnabled, True)
if self._widget.isVisible():
# Sometimes the caret isn't immediately visible, but unfocusing
# and refocusing it fixes that.
self._widget.clearFocus()
- self._widget.setFocus(Qt.FocusReason.OtherFocusReason)
+ self._widget.setFocus(core.Qt.FocusReason.OtherFocusReason)
# Move the caret to the first element in the viewport if there
# isn't any text which is already selected.
@@ -269,22 +263,22 @@ class WebKitCaret(browsertab.AbstractCaret):
self._widget.page().currentFrame().evaluateJavaScript(
resources.read_file('javascript/position_caret.js'))
- @pyqtSlot(usertypes.KeyMode)
+ @core.pyqtSlot(usertypes.KeyMode)
def _on_mode_left(self, _mode):
settings = self._widget.settings()
- if settings.testAttribute(QWebSettings.WebAttribute.CaretBrowsingEnabled):
+ if settings.testAttribute(webkit.QWebSettings.WebAttribute.CaretBrowsingEnabled):
if (self._selection_state is not browsertab.SelectionState.none and
self._widget.hasSelection()):
# Remove selection if it exists
- self._widget.triggerPageAction(QWebPage.WebAction.MoveToNextChar)
- settings.setAttribute(QWebSettings.WebAttribute.CaretBrowsingEnabled, False)
+ self._widget.triggerPageAction(webkitwidgets.QWebPage.WebAction.MoveToNextChar)
+ settings.setAttribute(webkit.QWebSettings.WebAttribute.CaretBrowsingEnabled, False)
self._selection_state = browsertab.SelectionState.none
def move_to_next_line(self, count=1):
if self._selection_state is not browsertab.SelectionState.none:
- act = QWebPage.WebAction.SelectNextLine
+ act = webkitwidgets.QWebPage.WebAction.SelectNextLine
else:
- act = QWebPage.WebAction.MoveToNextLine
+ act = webkitwidgets.QWebPage.WebAction.MoveToNextLine
for _ in range(count):
self._widget.triggerPageAction(act)
if self._selection_state is browsertab.SelectionState.line:
@@ -292,9 +286,9 @@ class WebKitCaret(browsertab.AbstractCaret):
def move_to_prev_line(self, count=1):
if self._selection_state is not browsertab.SelectionState.none:
- act = QWebPage.WebAction.SelectPreviousLine
+ act = webkitwidgets.QWebPage.WebAction.SelectPreviousLine
else:
- act = QWebPage.WebAction.MoveToPreviousLine
+ act = webkitwidgets.QWebPage.WebAction.MoveToPreviousLine
for _ in range(count):
self._widget.triggerPageAction(act)
if self._selection_state is browsertab.SelectionState.line:
@@ -302,89 +296,89 @@ class WebKitCaret(browsertab.AbstractCaret):
def move_to_next_char(self, count=1):
if self._selection_state is browsertab.SelectionState.normal:
- act = QWebPage.WebAction.SelectNextChar
+ act = webkitwidgets.QWebPage.WebAction.SelectNextChar
elif self._selection_state is browsertab.SelectionState.line:
return
else:
- act = QWebPage.WebAction.MoveToNextChar
+ act = webkitwidgets.QWebPage.WebAction.MoveToNextChar
for _ in range(count):
self._widget.triggerPageAction(act)
def move_to_prev_char(self, count=1):
if self._selection_state is browsertab.SelectionState.normal:
- act = QWebPage.WebAction.SelectPreviousChar
+ act = webkitwidgets.QWebPage.WebAction.SelectPreviousChar
elif self._selection_state is browsertab.SelectionState.line:
return
else:
- act = QWebPage.WebAction.MoveToPreviousChar
+ act = webkitwidgets.QWebPage.WebAction.MoveToPreviousChar
for _ in range(count):
self._widget.triggerPageAction(act)
def move_to_end_of_word(self, count=1):
if self._selection_state is browsertab.SelectionState.normal:
- act = [QWebPage.WebAction.SelectNextWord]
+ act = [webkitwidgets.QWebPage.WebAction.SelectNextWord]
if utils.is_windows: # pragma: no cover
- act.append(QWebPage.WebAction.SelectPreviousChar)
+ act.append(webkitwidgets.QWebPage.WebAction.SelectPreviousChar)
elif self._selection_state is browsertab.SelectionState.line:
return
else:
- act = [QWebPage.WebAction.MoveToNextWord]
+ act = [webkitwidgets.QWebPage.WebAction.MoveToNextWord]
if utils.is_windows: # pragma: no cover
- act.append(QWebPage.WebAction.MoveToPreviousChar)
+ act.append(webkitwidgets.QWebPage.WebAction.MoveToPreviousChar)
for _ in range(count):
for a in act:
self._widget.triggerPageAction(a)
def move_to_next_word(self, count=1):
if self._selection_state is browsertab.SelectionState.normal:
- act = [QWebPage.WebAction.SelectNextWord]
+ act = [webkitwidgets.QWebPage.WebAction.SelectNextWord]
if not utils.is_windows: # pragma: no branch
- act.append(QWebPage.WebAction.SelectNextChar)
+ act.append(webkitwidgets.QWebPage.WebAction.SelectNextChar)
elif self._selection_state is browsertab.SelectionState.line:
return
else:
- act = [QWebPage.WebAction.MoveToNextWord]
+ act = [webkitwidgets.QWebPage.WebAction.MoveToNextWord]
if not utils.is_windows: # pragma: no branch
- act.append(QWebPage.WebAction.MoveToNextChar)
+ act.append(webkitwidgets.QWebPage.WebAction.MoveToNextChar)
for _ in range(count):
for a in act:
self._widget.triggerPageAction(a)
def move_to_prev_word(self, count=1):
if self._selection_state is browsertab.SelectionState.normal:
- act = QWebPage.WebAction.SelectPreviousWord
+ act = webkitwidgets.QWebPage.WebAction.SelectPreviousWord
elif self._selection_state is browsertab.SelectionState.line:
return
else:
- act = QWebPage.WebAction.MoveToPreviousWord
+ act = webkitwidgets.QWebPage.WebAction.MoveToPreviousWord
for _ in range(count):
self._widget.triggerPageAction(act)
def move_to_start_of_line(self):
if self._selection_state is browsertab.SelectionState.normal:
- act = QWebPage.WebAction.SelectStartOfLine
+ act = webkitwidgets.QWebPage.WebAction.SelectStartOfLine
elif self._selection_state is browsertab.SelectionState.line:
return
else:
- act = QWebPage.WebAction.MoveToStartOfLine
+ act = webkitwidgets.QWebPage.WebAction.MoveToStartOfLine
self._widget.triggerPageAction(act)
def move_to_end_of_line(self):
if self._selection_state is browsertab.SelectionState.normal:
- act = QWebPage.WebAction.SelectEndOfLine
+ act = webkitwidgets.QWebPage.WebAction.SelectEndOfLine
elif self._selection_state is browsertab.SelectionState.line:
return
else:
- act = QWebPage.WebAction.MoveToEndOfLine
+ act = webkitwidgets.QWebPage.WebAction.MoveToEndOfLine
self._widget.triggerPageAction(act)
def move_to_start_of_next_block(self, count=1):
if self._selection_state is not browsertab.SelectionState.none:
- act = [QWebPage.WebAction.SelectNextLine,
- QWebPage.WebAction.SelectStartOfBlock]
+ act = [webkitwidgets.QWebPage.WebAction.SelectNextLine,
+ webkitwidgets.QWebPage.WebAction.SelectStartOfBlock]
else:
- act = [QWebPage.WebAction.MoveToNextLine,
- QWebPage.WebAction.MoveToStartOfBlock]
+ act = [webkitwidgets.QWebPage.WebAction.MoveToNextLine,
+ webkitwidgets.QWebPage.WebAction.MoveToStartOfBlock]
for _ in range(count):
for a in act:
self._widget.triggerPageAction(a)
@@ -393,11 +387,11 @@ class WebKitCaret(browsertab.AbstractCaret):
def move_to_start_of_prev_block(self, count=1):
if self._selection_state is not browsertab.SelectionState.none:
- act = [QWebPage.WebAction.SelectPreviousLine,
- QWebPage.WebAction.SelectStartOfBlock]
+ act = [webkitwidgets.QWebPage.WebAction.SelectPreviousLine,
+ webkitwidgets.QWebPage.WebAction.SelectStartOfBlock]
else:
- act = [QWebPage.WebAction.MoveToPreviousLine,
- QWebPage.WebAction.MoveToStartOfBlock]
+ act = [webkitwidgets.QWebPage.WebAction.MoveToPreviousLine,
+ webkitwidgets.QWebPage.WebAction.MoveToStartOfBlock]
for _ in range(count):
for a in act:
self._widget.triggerPageAction(a)
@@ -406,11 +400,11 @@ class WebKitCaret(browsertab.AbstractCaret):
def move_to_end_of_next_block(self, count=1):
if self._selection_state is not browsertab.SelectionState.none:
- act = [QWebPage.WebAction.SelectNextLine,
- QWebPage.WebAction.SelectEndOfBlock]
+ act = [webkitwidgets.QWebPage.WebAction.SelectNextLine,
+ webkitwidgets.QWebPage.WebAction.SelectEndOfBlock]
else:
- act = [QWebPage.WebAction.MoveToNextLine,
- QWebPage.WebAction.MoveToEndOfBlock]
+ act = [webkitwidgets.QWebPage.WebAction.MoveToNextLine,
+ webkitwidgets.QWebPage.WebAction.MoveToEndOfBlock]
for _ in range(count):
for a in act:
self._widget.triggerPageAction(a)
@@ -419,9 +413,9 @@ class WebKitCaret(browsertab.AbstractCaret):
def move_to_end_of_prev_block(self, count=1):
if self._selection_state is not browsertab.SelectionState.none:
- act = [QWebPage.WebAction.SelectPreviousLine, QWebPage.WebAction.SelectEndOfBlock]
+ act = [webkitwidgets.QWebPage.WebAction.SelectPreviousLine, webkitwidgets.QWebPage.WebAction.SelectEndOfBlock]
else:
- act = [QWebPage.WebAction.MoveToPreviousLine, QWebPage.WebAction.MoveToEndOfBlock]
+ act = [webkitwidgets.QWebPage.WebAction.MoveToPreviousLine, webkitwidgets.QWebPage.WebAction.MoveToEndOfBlock]
for _ in range(count):
for a in act:
self._widget.triggerPageAction(a)
@@ -430,18 +424,18 @@ class WebKitCaret(browsertab.AbstractCaret):
def move_to_start_of_document(self):
if self._selection_state is not browsertab.SelectionState.none:
- act = QWebPage.WebAction.SelectStartOfDocument
+ act = webkitwidgets.QWebPage.WebAction.SelectStartOfDocument
else:
- act = QWebPage.WebAction.MoveToStartOfDocument
+ act = webkitwidgets.QWebPage.WebAction.MoveToStartOfDocument
self._widget.triggerPageAction(act)
if self._selection_state is browsertab.SelectionState.line:
self._select_line()
def move_to_end_of_document(self):
if self._selection_state is not browsertab.SelectionState.none:
- act = QWebPage.WebAction.SelectEndOfDocument
+ act = webkitwidgets.QWebPage.WebAction.SelectEndOfDocument
else:
- act = QWebPage.WebAction.MoveToEndOfDocument
+ act = webkitwidgets.QWebPage.WebAction.MoveToEndOfDocument
self._widget.triggerPageAction(act)
def toggle_selection(self, line=False):
@@ -458,7 +452,7 @@ class WebKitCaret(browsertab.AbstractCaret):
self.selection_toggled.emit(self._selection_state)
def drop_selection(self):
- self._widget.triggerPageAction(QWebPage.WebAction.MoveToNextChar)
+ self._widget.triggerPageAction(webkitwidgets.QWebPage.WebAction.MoveToNextChar)
def selection(self, callback):
callback(self._widget.selectedText())
@@ -473,9 +467,9 @@ class WebKitCaret(browsertab.AbstractCaret):
}""")
def _select_line(self):
- self._widget.triggerPageAction(QWebPage.WebAction.SelectStartOfLine)
+ self._widget.triggerPageAction(webkitwidgets.QWebPage.WebAction.SelectStartOfLine)
self.reverse_selection()
- self._widget.triggerPageAction(QWebPage.WebAction.SelectEndOfLine)
+ self._widget.triggerPageAction(webkitwidgets.QWebPage.WebAction.SelectEndOfLine)
self.reverse_selection()
def _select_line_to_end(self):
@@ -483,11 +477,11 @@ class WebKitCaret(browsertab.AbstractCaret):
# of focus) has to be checked before moving selection
# to the end of line
if self._js_selection_left_to_right():
- self._widget.triggerPageAction(QWebPage.WebAction.SelectEndOfLine)
+ self._widget.triggerPageAction(webkitwidgets.QWebPage.WebAction.SelectEndOfLine)
def _select_line_to_start(self):
if not self._js_selection_left_to_right():
- self._widget.triggerPageAction(QWebPage.WebAction.SelectStartOfLine)
+ self._widget.triggerPageAction(webkitwidgets.QWebPage.WebAction.SelectStartOfLine)
def _js_selection_left_to_right(self):
"""Return True iff the selection's direction is left to right."""
@@ -499,8 +493,8 @@ class WebKitCaret(browsertab.AbstractCaret):
""")
def _follow_selected(self, *, tab=False):
- if QWebSettings.globalSettings().testAttribute(
- QWebSettings.WebAttribute.JavascriptEnabled):
+ if webkit.QWebSettings.globalSettings().testAttribute(
+ webkit.QWebSettings.WebAttribute.JavascriptEnabled):
if tab:
self._tab.data.override_target = usertypes.ClickTarget.tab
self._tab.run_js_async("""
@@ -533,7 +527,7 @@ class WebKitCaret(browsertab.AbstractCaret):
except KeyError:
raise browsertab.WebTabError('Anchor element without '
'href!')
- url = self._tab.url().resolved(QUrl(href))
+ url = self._tab.url().resolved(core.QUrl(href))
if tab:
self._tab.new_tab_requested.emit(url)
else:
@@ -602,7 +596,7 @@ class WebKitScroller(browsertab.AbstractScroller):
elif x is None and y == 100:
self.bottom()
else:
- for val, orientation in [(x, Qt.Orientation.Horizontal), (y, Qt.Orientation.Vertical)]:
+ for val, orientation in [(x, core.Qt.Orientation.Horizontal), (y, core.Qt.Orientation.Vertical)]:
if val is not None:
frame = self._widget.page().mainFrame()
maximum = frame.scrollBarMaximum(orientation)
@@ -627,47 +621,47 @@ class WebKitScroller(browsertab.AbstractScroller):
self._tab.fake_key_press(key)
def up(self, count=1):
- self._key_press(Qt.Key.Key_Up, count, 'scrollBarMinimum', Qt.Orientation.Vertical)
+ self._key_press(core.Qt.Key.Key_Up, count, 'scrollBarMinimum', core.Qt.Orientation.Vertical)
def down(self, count=1):
- self._key_press(Qt.Key.Key_Down, count, 'scrollBarMaximum', Qt.Orientation.Vertical)
+ self._key_press(core.Qt.Key.Key_Down, count, 'scrollBarMaximum', core.Qt.Orientation.Vertical)
def left(self, count=1):
- self._key_press(Qt.Key.Key_Left, count, 'scrollBarMinimum', Qt.Orientation.Horizontal)
+ self._key_press(core.Qt.Key.Key_Left, count, 'scrollBarMinimum', core.Qt.Orientation.Horizontal)
def right(self, count=1):
- self._key_press(Qt.Key.Key_Right, count, 'scrollBarMaximum', Qt.Orientation.Horizontal)
+ self._key_press(core.Qt.Key.Key_Right, count, 'scrollBarMaximum', core.Qt.Orientation.Horizontal)
def top(self):
- self._key_press(Qt.Key.Key_Home)
+ self._key_press(core.Qt.Key.Key_Home)
def bottom(self):
- self._key_press(Qt.Key.Key_End)
+ self._key_press(core.Qt.Key.Key_End)
def page_up(self, count=1):
- self._key_press(Qt.Key.Key_PageUp, count, 'scrollBarMinimum', Qt.Orientation.Vertical)
+ self._key_press(core.Qt.Key.Key_PageUp, count, 'scrollBarMinimum', core.Qt.Orientation.Vertical)
def page_down(self, count=1):
- self._key_press(Qt.Key.Key_PageDown, count, 'scrollBarMaximum',
- Qt.Orientation.Vertical)
+ self._key_press(core.Qt.Key.Key_PageDown, count, 'scrollBarMaximum',
+ core.Qt.Orientation.Vertical)
def at_top(self):
return self.pos_px().y() == 0
def at_bottom(self):
frame = self._widget.page().currentFrame()
- return self.pos_px().y() >= frame.scrollBarMaximum(Qt.Orientation.Vertical)
+ return self.pos_px().y() >= frame.scrollBarMaximum(core.Qt.Orientation.Vertical)
class WebKitHistoryPrivate(browsertab.AbstractHistoryPrivate):
"""History-related methods which are not part of the extension API."""
- _history: QWebHistory
+ _history: webkit.QWebHistory
def __init__(self, tab: 'WebKitTab') -> None:
self._tab = tab
- self._history = cast(QWebHistory, None)
+ self._history = cast(webkit.QWebHistory, None)
def serialize(self):
return qtutils.serialize(self._history)
@@ -689,8 +683,8 @@ class WebKitHistoryPrivate(browsertab.AbstractHistoryPrivate):
if 'zoom' in cur_data:
self._tab.zoom.set_factor(cur_data['zoom'])
if ('scroll-pos' in cur_data and
- self._tab.scroller.pos_px() == QPoint(0, 0)):
- QTimer.singleShot(0, functools.partial(
+ self._tab.scroller.pos_px() == core.QPoint(0, 0)):
+ core.QTimer.singleShot(0, functools.partial(
self._tab.scroller.to_point, cur_data['scroll-pos']))
@@ -750,7 +744,7 @@ class WebKitElements(browsertab.AbstractElements):
elems = []
frames = webkitelem.get_child_frames(mainframe)
for f in frames:
- frame_elems = cast(Iterable[QWebElement], f.findAllElements(selector))
+ frame_elems = cast(Iterable[webkit.QWebElement], f.findAllElements(selector))
for elem in frame_elems:
elems.append(webkitelem.WebKitElement(elem, tab=self._tab))
@@ -775,7 +769,7 @@ class WebKitElements(browsertab.AbstractElements):
self.find_css('#' + elem_id, find_id_cb, error_cb=lambda exc: None)
def find_focused(self, callback):
- frame = cast(Optional[QWebFrame], self._widget.page().currentFrame())
+ frame = cast(Optional[webkitwidgets.QWebFrame], self._widget.page().currentFrame())
if frame is None:
callback(None)
return
@@ -789,7 +783,7 @@ class WebKitElements(browsertab.AbstractElements):
def find_at_pos(self, pos, callback):
assert pos.x() >= 0
assert pos.y() >= 0
- frame = cast(Optional[QWebFrame], self._widget.page().frameAt(pos))
+ frame = cast(Optional[webkitwidgets.QWebFrame], self._widget.page().frameAt(pos))
if frame is None:
# This happens when we click inside the webview, but not actually
# on the QWebPage - for example when clicking the scrollbar
@@ -902,7 +896,7 @@ class WebKitTab(browsertab.AbstractTab):
def _make_private(self, widget):
settings = widget.settings()
- settings.setAttribute(QWebSettings.WebAttribute.PrivateBrowsingEnabled, True)
+ settings.setAttribute(webkit.QWebSettings.WebAttribute.PrivateBrowsingEnabled, True)
def load_url(self, url):
self._load_url_prepare(url)
@@ -934,9 +928,9 @@ class WebKitTab(browsertab.AbstractTab):
def reload(self, *, force=False):
if force:
- action = QWebPage.WebAction.ReloadAndBypassCache
+ action = webkitwidgets.QWebPage.WebAction.ReloadAndBypassCache
else:
- action = QWebPage.WebAction.Reload
+ action = webkitwidgets.QWebPage.WebAction.Reload
self._widget.triggerPageAction(action)
def stop(self):
@@ -948,30 +942,30 @@ class WebKitTab(browsertab.AbstractTab):
def renderer_process_pid(self) -> Optional[int]:
return None
- @pyqtSlot()
+ @core.pyqtSlot()
def _on_history_trigger(self):
url = self.url()
requested_url = self.url(requested=True)
self.history_item_triggered.emit(url, requested_url, self.title())
- def set_html(self, html, base_url=QUrl()):
+ def set_html(self, html, base_url=core.QUrl()):
self._widget.setHtml(html, base_url)
- @pyqtSlot()
+ @core.pyqtSlot()
def _on_load_started(self):
super()._on_load_started()
nam = self._widget.page().networkAccessManager()
assert isinstance(nam, networkmanager.NetworkManager), nam
nam.netrc_used = False
# Make sure the icon is cleared when navigating to a page without one.
- self.icon_changed.emit(QIcon())
+ self.icon_changed.emit(gui.QIcon())
- @pyqtSlot(bool)
+ @core.pyqtSlot(bool)
def _on_load_finished(self, ok: bool) -> None:
super()._on_load_finished(ok)
self._update_load_status(ok)
- @pyqtSlot()
+ @core.pyqtSlot()
def _on_frame_load_finished(self):
"""Make sure we emit an appropriate status when loading finished.
@@ -983,7 +977,7 @@ class WebKitTab(browsertab.AbstractTab):
assert isinstance(page, webpage.BrowserPage), page
self._on_load_finished(not page.error_occurred)
- @pyqtSlot()
+ @core.pyqtSlot()
def _on_webkit_icon_changed(self):
"""Emit iconChanged with a QIcon like QWebEngineView does."""
if sip.isdeleted(self._widget):
@@ -991,7 +985,7 @@ class WebKitTab(browsertab.AbstractTab):
return
self.icon_changed.emit(self._widget.icon())
- @pyqtSlot(QWebFrame)
+ @core.pyqtSlot(webkitwidgets.QWebFrame)
def _on_frame_created(self, frame):
"""Connect the contentsSizeChanged signal of each frame."""
# FIXME:qtwebengine those could theoretically regress:
@@ -999,11 +993,11 @@ class WebKitTab(browsertab.AbstractTab):
# https://github.com/qutebrowser/qutebrowser/issues/263
frame.contentsSizeChanged.connect(self._on_contents_size_changed)
- @pyqtSlot(QSize)
+ @core.pyqtSlot(core.QSize)
def _on_contents_size_changed(self, size):
- self.contents_size_changed.emit(QSizeF(size))
+ self.contents_size_changed.emit(core.QSizeF(size))
- @pyqtSlot(usertypes.NavigationRequest)
+ @core.pyqtSlot(usertypes.NavigationRequest)
def _on_navigation_request(self, navigation):
super()._on_navigation_request(navigation)
if not navigation.accepted:
@@ -1028,7 +1022,7 @@ class WebKitTab(browsertab.AbstractTab):
if navigation.is_main_frame:
self.settings.update_for_url(navigation.url)
- @pyqtSlot('QNetworkReply*')
+ @core.pyqtSlot('QNetworkReply*')
def _on_ssl_errors(self, reply):
self._insecure_hosts.add(reply.url().host())
diff --git a/qutebrowser/browser/webkit/webpage.py b/qutebrowser/browser/webkit/webpage.py
index 2dd4551b9..a71063526 100644
--- a/qutebrowser/browser/webkit/webpage.py
+++ b/qutebrowser/browser/webkit/webpage.py
@@ -24,23 +24,17 @@
import html
import functools
-
-from qutebrowser.qt.core import pyqtSlot, pyqtSignal, Qt, QUrl, QPoint
-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
-from qutebrowser.qt.webkitwidgets import QWebPage, QWebFrame
+from qutebrowser.qt import widgets, webkitwidgets, printsupport, network, gui
from qutebrowser.config import websettings, config
from qutebrowser.browser import pdfjs, shared, downloads, greasemonkey
from qutebrowser.browser.webkit import http
from qutebrowser.browser.webkit.network import networkmanager
from qutebrowser.utils import message, usertypes, log, jinja, objreg
-from qutebrowser.qt import sip
+from qutebrowser.qt import core, sip
-class BrowserPage(QWebPage):
+class BrowserPage(webkitwidgets.QWebPage):
"""Our own QWebPage with advanced features.
@@ -60,9 +54,9 @@ class BrowserPage(QWebPage):
navigation_request: Emitted on acceptNavigationRequest.
"""
- shutting_down = pyqtSignal()
- reloading = pyqtSignal(QUrl)
- navigation_request = pyqtSignal(usertypes.NavigationRequest)
+ shutting_down = core.pyqtSignal()
+ reloading = core.pyqtSignal(core.QUrl)
+ navigation_request = core.pyqtSignal(usertypes.NavigationRequest)
def __init__(self, win_id, tab_id, tabdata, private, parent=None):
super().__init__(parent)
@@ -70,8 +64,8 @@ class BrowserPage(QWebPage):
self._tabdata = tabdata
self._is_shutting_down = False
self._extension_handlers = {
- QWebPage.Extension.ErrorPageExtension: self._handle_errorpage,
- QWebPage.Extension.ChooseMultipleFilesExtension: self._handle_multiple_files,
+ webkitwidgets.QWebPage.Extension.ErrorPageExtension: self._handle_errorpage,
+ webkitwidgets.QWebPage.Extension.ChooseMultipleFilesExtension: self._handle_multiple_files,
}
self._ignore_load_started = False
self.error_occurred = False
@@ -99,7 +93,7 @@ class BrowserPage(QWebPage):
self.frameCreated.connect( # type: ignore[attr-defined]
self._connect_userjs_signals)
- @pyqtSlot('QWebFrame*')
+ @core.pyqtSlot('QWebFrame*')
def _connect_userjs_signals(self, frame):
"""Connect userjs related signals to `frame`.
@@ -137,27 +131,27 @@ class BrowserPage(QWebPage):
False if no error page should be displayed, True otherwise.
"""
ignored_errors = [
- (QWebPage.ErrorDomain.QtNetwork, QNetworkReply.NetworkError.OperationCanceledError),
+ (webkitwidgets.QWebPage.ErrorDomain.QtNetwork, network.QNetworkReply.NetworkError.OperationCanceledError),
# "Loading is handled by the media engine"
- (QWebPage.ErrorDomain.WebKit, 203),
+ (webkitwidgets.QWebPage.ErrorDomain.WebKit, 203),
# "Frame load interrupted by policy change"
- (QWebPage.ErrorDomain.WebKit, 102),
+ (webkitwidgets.QWebPage.ErrorDomain.WebKit, 102),
]
errpage.baseUrl = info.url
urlstr = info.url.toDisplayString()
- if (info.domain, info.error) == (QWebPage.ErrorDomain.QtNetwork,
- QNetworkReply.NetworkError.ProtocolUnknownError):
+ if (info.domain, info.error) == (webkitwidgets.QWebPage.ErrorDomain.QtNetwork,
+ network.QNetworkReply.NetworkError.ProtocolUnknownError):
# For some reason, we get a segfault when we use
# QDesktopServices::openUrl with info.url directly - however it
# works when we construct a copy of it.
- url = QUrl(info.url)
+ url = core.QUrl(info.url)
scheme = url.scheme()
message.confirm_async(
title="Open external application for {}-link?".format(scheme),
text="URL: <b>{}</b>".format(
html.escape(url.toDisplayString())),
- yes_action=functools.partial(QDesktopServices.openUrl, url),
- url=info.url.toString(QUrl.UrlFormattingOption.RemovePassword | QUrl.ComponentFormattingOption.FullyEncoded))
+ yes_action=functools.partial(gui.QDesktopServices.openUrl, url),
+ url=info.url.toString(core.QUrl.UrlFormattingOption.RemovePassword | core.QUrl.ComponentFormattingOption.FullyEncoded))
return True
elif (info.domain, info.error) in ignored_errors:
log.webview.debug("Ignored error on {}: {} (error domain: {}, "
@@ -176,7 +170,7 @@ class BrowserPage(QWebPage):
# any space. We can't hide the frame's documentElement
# directly though.
for elem in main_frame.documentElement().findAll('iframe'):
- if QUrl(elem.attribute('src')) == info.url:
+ if core.QUrl(elem.attribute('src')) == info.url:
elem.setAttribute('style', 'display: none')
return False
else:
@@ -194,7 +188,7 @@ class BrowserPage(QWebPage):
errpage.encoding = 'utf-8'
return True
- def chooseFile(self, parent_frame: QWebFrame, suggested_file: str) -> str:
+ def chooseFile(self, parent_frame: webkitwidgets.QWebFrame, suggested_file: str) -> str:
"""Override chooseFile to (optionally) invoke custom file uploader."""
handler = config.val.fileselect.handler
if handler == "default":
@@ -226,7 +220,7 @@ class BrowserPage(QWebPage):
if info.suggestedFileNames:
suggested_file = info.suggestedFileNames[0]
- files.fileNames, _ = QFileDialog.getOpenFileNames(
+ files.fileNames, _ = widgets.QFileDialog.getOpenFileNames(
None, None, suggested_file) # type: ignore[arg-type]
return True
@@ -253,8 +247,8 @@ class BrowserPage(QWebPage):
def on_print_requested(self, frame):
"""Handle printing when requested via javascript."""
- printdiag = QPrintDialog()
- printdiag.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose)
+ printdiag = printsupport.QPrintDialog()
+ printdiag.setAttribute(core.Qt.WidgetAttribute.WA_DeleteOnClose)
printdiag.open(lambda: frame.print(printdiag.printer()))
def on_download_requested(self, request):
@@ -265,11 +259,11 @@ class BrowserPage(QWebPage):
soon as the user has entered the filename, as Qt seems to delete it
after this slot returns.
"""
- req = QNetworkRequest(request)
+ req = network.QNetworkRequest(request)
download_manager = objreg.get('qtnetwork-download-manager')
download_manager.get_request(req, qnam=self.networkAccessManager())
- @pyqtSlot('QNetworkReply*')
+ @core.pyqtSlot('QNetworkReply*')
def on_unsupported_content(self, reply):
"""Handle an unsupportedContent signal.
@@ -306,7 +300,7 @@ class BrowserPage(QWebPage):
download_manager.fetch(reply,
suggested_filename=suggested_filename)
- @pyqtSlot()
+ @core.pyqtSlot()
def on_load_started(self):
"""Reset error_occurred when loading of a new page started."""
if self._ignore_load_started:
@@ -349,10 +343,10 @@ class BrowserPage(QWebPage):
log.webview.debug(f'Running GM script: {script}')
frame.evaluateJavaScript(script.code())
- @pyqtSlot('QWebFrame*', 'QWebPage::Feature')
+ @core.pyqtSlot('QWebFrame*', 'QWebPage::Feature')
def _on_feature_permission_requested(self, frame, feature):
"""Ask the user for approval for geolocation/notifications."""
- if not isinstance(frame, QWebFrame): # pragma: no cover
+ if not isinstance(frame, webkitwidgets.QWebFrame): # pragma: no cover
# This makes no sense whatsoever, but someone reported this being
# called with a QBuffer...
log.misc.error("on_feature_permission_requested got called with "
@@ -360,24 +354,24 @@ class BrowserPage(QWebPage):
return
options = {
- QWebPage.Feature.Notifications: 'content.notifications.enabled',
- QWebPage.Feature.Geolocation: 'content.geolocation',
+ webkitwidgets.QWebPage.Feature.Notifications: 'content.notifications.enabled',
+ webkitwidgets.QWebPage.Feature.Geolocation: 'content.geolocation',
}
messages = {
- QWebPage.Feature.Notifications: 'show notifications',
- QWebPage.Feature.Geolocation: 'access your location',
+ webkitwidgets.QWebPage.Feature.Notifications: 'show notifications',
+ webkitwidgets.QWebPage.Feature.Geolocation: 'access your location',
}
yes_action = functools.partial(
self.setFeaturePermission, frame, feature,
- QWebPage.PermissionPolicy.PermissionGrantedByUser)
+ webkitwidgets.QWebPage.PermissionPolicy.PermissionGrantedByUser)
no_action = functools.partial(
self.setFeaturePermission, frame, feature,
- QWebPage.PermissionPolicy.PermissionDeniedByUser)
+ webkitwidgets.QWebPage.PermissionPolicy.PermissionDeniedByUser)
- url = frame.url().adjusted(QUrl.UrlFormattingOption.RemoveUserInfo | # type: ignore[operator]
- QUrl.UrlFormattingOption.RemovePath |
- QUrl.UrlFormattingOption.RemoveQuery |
- QUrl.UrlFormattingOption.RemoveFragment)
+ url = frame.url().adjusted(core.QUrl.UrlFormattingOption.RemoveUserInfo | # type: ignore[operator]
+ core.QUrl.UrlFormattingOption.RemovePath |
+ core.QUrl.UrlFormattingOption.RemoveQuery |
+ core.QUrl.UrlFormattingOption.RemoveFragment)
question = shared.feature_permission(
url=url,
option=options[feature], msg=messages[feature],
@@ -431,7 +425,7 @@ class BrowserPage(QWebPage):
return
if 'zoom' in data:
frame.page().view().tab.zoom.set_factor(data['zoom'])
- if 'scroll-pos' in data and frame.scrollPosition() == QPoint(0, 0):
+ if 'scroll-pos' in data and frame.scrollPosition() == core.QPoint(0, 0):
frame.setScrollPosition(data['scroll-pos'])
def userAgentForUrl(self, url):
@@ -497,9 +491,9 @@ class BrowserPage(QWebPage):
source, line, msg)
def acceptNavigationRequest(self,
- frame: QWebFrame,
- request: QNetworkRequest,
- typ: QWebPage.NavigationType) -> bool:
+ frame: webkitwidgets.QWebFrame,
+ request: network.QNetworkRequest,
+ typ: webkitwidgets.QWebPage.NavigationType) -> bool:
"""Override acceptNavigationRequest to handle clicked links.
Setting linkDelegationPolicy to DelegateAllLinks and using a slot bound
@@ -510,17 +504,17 @@ class BrowserPage(QWebPage):
and then conditionally opens the URL here or in another tab/window.
"""
type_map = {
- QWebPage.NavigationType.NavigationTypeLinkClicked:
+ webkitwidgets.QWebPage.NavigationType.NavigationTypeLinkClicked:
usertypes.NavigationRequest.Type.link_clicked,
- QWebPage.NavigationType.NavigationTypeFormSubmitted:
+ webkitwidgets.QWebPage.NavigationType.NavigationTypeFormSubmitted:
usertypes.NavigationRequest.Type.form_submitted,
- QWebPage.NavigationType.NavigationTypeFormResubmitted:
+ webkitwidgets.QWebPage.NavigationType.NavigationTypeFormResubmitted:
usertypes.NavigationRequest.Type.form_resubmitted,
- QWebPage.NavigationType.NavigationTypeBackOrForward:
+ webkitwidgets.QWebPage.NavigationType.NavigationTypeBackOrForward:
usertypes.NavigationRequest.Type.back_forward,
- QWebPage.NavigationType.NavigationTypeReload:
+ webkitwidgets.QWebPage.NavigationType.NavigationTypeReload:
usertypes.NavigationRequest.Type.reload,
- QWebPage.NavigationType.NavigationTypeOther:
+ webkitwidgets.QWebPage.NavigationType.NavigationTypeOther:
usertypes.NavigationRequest.Type.other,
}
is_main_frame = frame is self.mainFrame()
diff --git a/qutebrowser/browser/webkit/webview.py b/qutebrowser/browser/webkit/webview.py
index aaeba4033..1f4dfbfce 100644
--- a/qutebrowser/browser/webkit/webview.py
+++ b/qutebrowser/browser/webkit/webview.py
@@ -21,18 +21,16 @@
# pylint: disable=no-name-in-module
"""The main browser widgets."""
-
-from qutebrowser.qt.core import pyqtSignal, Qt, QUrl
-from qutebrowser.qt.webkit import QWebSettings
-from qutebrowser.qt.webkitwidgets import QWebView, QWebPage
+from qutebrowser.qt import webkitwidgets, webkit
from qutebrowser.config import config, stylesheet
from qutebrowser.keyinput import modeman
from qutebrowser.utils import log, usertypes, utils, objreg, debug
from qutebrowser.browser.webkit import webpage
+from qutebrowser.qt import core
-class WebView(QWebView):
+class WebView(webkitwidgets.QWebView):
"""Custom QWebView subclass with qutebrowser-specific features.
@@ -59,8 +57,8 @@ class WebView(QWebView):
}
"""
- scroll_pos_changed = pyqtSignal(int, int)
- shutting_down = pyqtSignal()
+ scroll_pos_changed = core.pyqtSignal(int, int)
+ shutting_down = core.pyqtSignal()
def __init__(self, *, win_id, tab_id, tab, private, parent=None):
super().__init__(parent)
@@ -77,15 +75,15 @@ class WebView(QWebView):
tabdata=tab.data, private=private,
parent=self)
page.setVisibilityState(
- QWebPage.VisibilityState.VisibilityStateVisible if self.isVisible()
- else QWebPage.VisibilityState.VisibilityStateHidden)
+ webkitwidgets.QWebPage.VisibilityState.VisibilityStateVisible if self.isVisible()
+ else webkitwidgets.QWebPage.VisibilityState.VisibilityStateHidden)
self.setPage(page)
stylesheet.set_register(self)
def __repr__(self):
- flags = QUrl.ComponentFormattingOption.EncodeUnicode
+ flags = core.QUrl.ComponentFormattingOption.EncodeUnicode
urlstr = self.url().toDisplayString(flags) # type: ignore[arg-type]
url = utils.elide(urlstr, 100)
return utils.get_repr(self, tab_id=self._tab_id, url=url)
@@ -110,7 +108,7 @@ class WebView(QWebView):
# quitting it seems.
log.destroy.debug("Shutting down {!r}.".format(self))
settings = self.settings()
- settings.setAttribute(QWebSettings.WebAttribute.JavascriptEnabled, False)
+ settings.setAttribute(webkit.QWebSettings.WebAttribute.JavascriptEnabled, False)
self.stop()
page = self.page()
assert isinstance(page, webpage.BrowserPage), page
@@ -135,9 +133,9 @@ class WebView(QWebView):
Return:
The new QWebView object.
"""
- debug_type = debug.qenum_key(QWebPage, wintype)
+ debug_type = debug.qenum_key(webkitwidgets.QWebPage, wintype)
log.webview.debug("createWindow with type {}".format(debug_type))
- if wintype == QWebPage.WebWindowType.WebModalDialog:
+ if wintype == webkitwidgets.QWebPage.WebWindowType.WebModalDialog:
log.webview.warning("WebModalDialog requested, but we don't "
"support that!")
tabbed_browser = objreg.get('tabbed-browser', scope='window',
@@ -159,12 +157,12 @@ class WebView(QWebView):
e: The QPaintEvent.
"""
frame = self.page().mainFrame()
- new_pos = (frame.scrollBarValue(Qt.Orientation.Horizontal),
- frame.scrollBarValue(Qt.Orientation.Vertical))
+ new_pos = (frame.scrollBarValue(core.Qt.Orientation.Horizontal),
+ frame.scrollBarValue(core.Qt.Orientation.Vertical))
if self._old_scroll_pos != new_pos:
self._old_scroll_pos = new_pos
- m = (frame.scrollBarMaximum(Qt.Orientation.Horizontal),
- frame.scrollBarMaximum(Qt.Orientation.Vertical))
+ m = (frame.scrollBarMaximum(core.Qt.Orientation.Horizontal),
+ frame.scrollBarMaximum(core.Qt.Orientation.Vertical))
perc = (round(100 * new_pos[0] / m[0]) if m[0] != 0 else 0,
round(100 * new_pos[1] / m[1]) if m[1] != 0 else 0)
self.scroll_pos = perc
@@ -190,7 +188,7 @@ class WebView(QWebView):
e: The QShowEvent.
"""
super().showEvent(e)
- self.page().setVisibilityState(QWebPage.VisibilityState.VisibilityStateVisible)
+ self.page().setVisibilityState(webkitwidgets.QWebPage.VisibilityState.VisibilityStateVisible)
def hideEvent(self, e):
"""Extend hideEvent to set the page visibility state to hidden.
@@ -199,16 +197,16 @@ class WebView(QWebView):
e: The QHideEvent.
"""
super().hideEvent(e)
- self.page().setVisibilityState(QWebPage.VisibilityState.VisibilityStateHidden)
+ self.page().setVisibilityState(webkitwidgets.QWebPage.VisibilityState.VisibilityStateHidden)
def mousePressEvent(self, e):
"""Set the tabdata ClickTarget on a mousepress.
This is implemented here as we don't need it for QtWebEngine.
"""
- if e.button() == Qt.MouseButton.MidButton or e.modifiers() & Qt.KeyboardModifier.ControlModifier:
+ if e.button() == core.Qt.MouseButton.MidButton or e.modifiers() & core.Qt.KeyboardModifier.ControlModifier:
background = config.val.tabs.background
- if e.modifiers() & Qt.KeyboardModifier.ShiftModifier:
+ if e.modifiers() & core.Qt.KeyboardModifier.ShiftModifier:
background = not background
if background:
target = usertypes.ClickTarget.tab_bg
diff --git a/qutebrowser/commands/argparser.py b/qutebrowser/commands/argparser.py
index febfa7812..c8a4c10e5 100644
--- a/qutebrowser/commands/argparser.py
+++ b/qutebrowser/commands/argparser.py
@@ -21,7 +21,7 @@
import argparse
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import core
from qutebrowser.commands import cmdexc
from qutebrowser.utils import utils, objreg, log
@@ -60,7 +60,7 @@ class HelpAction(argparse.Action):
tabbed_browser = objreg.get('tabbed-browser', scope='window',
window='last-focused')
tabbed_browser.tabopen(
- QUrl('qute://help/commands.html#{}'.format(parser.name)))
+ core.QUrl('qute://help/commands.html#{}'.format(parser.name)))
parser.exit()
diff --git a/qutebrowser/commands/runners.py b/qutebrowser/commands/runners.py
index 7cf6ab6fa..1b5544257 100644
--- a/qutebrowser/commands/runners.py
+++ b/qutebrowser/commands/runners.py
@@ -24,12 +24,11 @@ import re
import contextlib
from typing import TYPE_CHECKING, Callable, Dict, Iterator, Mapping, MutableMapping
-from qutebrowser.qt.core import pyqtSlot, QUrl, QObject
-
from qutebrowser.api import cmdutils
from qutebrowser.commands import cmdexc, parser
from qutebrowser.utils import message, objreg, qtutils, usertypes, utils
from qutebrowser.keyinput import macros, modeman
+from qutebrowser.qt import core
if TYPE_CHECKING:
from qutebrowser.mainwindow import tabbedbrowser
@@ -55,9 +54,9 @@ def _init_variable_replacements() -> Mapping[str, _ReplacementFunction]:
"""Return a dict from variable replacements to fns processing them."""
replacements: Dict[str, _ReplacementFunction] = {
'url': lambda tb: _url(tb).toString(
- QUrl.ComponentFormattingOption.FullyEncoded | QUrl.UrlFormattingOption.RemovePassword),
+ core.QUrl.ComponentFormattingOption.FullyEncoded | core.QUrl.UrlFormattingOption.RemovePassword),
'url:pretty': lambda tb: _url(tb).toString(
- QUrl.ComponentFormattingOption.DecodeReserved | QUrl.UrlFormattingOption.RemovePassword),
+ core.QUrl.ComponentFormattingOption.DecodeReserved | core.QUrl.UrlFormattingOption.RemovePassword),
'url:domain': lambda tb: "{}://{}{}".format(
_url(tb).scheme(), _url(tb).host(),
":" + str(_url(tb).port()) if _url(tb).port() != -1 else ""),
@@ -116,15 +115,15 @@ def replace_variables(win_id, arglist):
return args
-class AbstractCommandRunner(QObject):
+class AbstractCommandRunner(core.QObject):
"""Abstract base class for CommandRunner."""
def run(self, text, count=None, *, safely=False):
raise NotImplementedError
- @pyqtSlot(str, int)
- @pyqtSlot(str)
+ @core.pyqtSlot(str, int)
+ @core.pyqtSlot(str)
def run_safely(self, text, count=None):
"""Run a command and display exceptions in the statusbar."""
self.run(text, count, safely=True)
diff --git a/qutebrowser/commands/userscripts.py b/qutebrowser/commands/userscripts.py
index 17164a23a..edb5a2957 100644
--- a/qutebrowser/commands/userscripts.py
+++ b/qutebrowser/commands/userscripts.py
@@ -24,18 +24,16 @@ import os.path
import tempfile
from typing import cast, Any, MutableMapping, Tuple
-from qutebrowser.qt.core import pyqtSignal, pyqtSlot, QObject, QSocketNotifier
-
import qutebrowser
from qutebrowser.utils import message, log, objreg, standarddir, utils
from qutebrowser.commands import runners
from qutebrowser.config import websettings
from qutebrowser.misc import guiprocess
from qutebrowser.browser import downloads
-from qutebrowser.qt import sip
+from qutebrowser.qt import core, sip
-class _QtFIFOReader(QObject):
+class _QtFIFOReader(core.QObject):
"""A FIFO reader based on a QSocketNotifier.
@@ -48,7 +46,7 @@ class _QtFIFOReader(QObject):
got_line: Emitted when a whole line arrived.
"""
- got_line = pyqtSignal(str)
+ got_line = core.pyqtSignal(str)
def __init__(self, filepath, parent=None):
super().__init__(parent)
@@ -61,11 +59,11 @@ class _QtFIFOReader(QObject):
fd = os.open(filepath, os.O_RDWR | os.O_NONBLOCK)
# pylint: enable=no-member,useless-suppression
self._fifo = os.fdopen(fd, 'r')
- self._notifier = QSocketNotifier(cast(sip.voidptr, fd),
- QSocketNotifier.Type.Read, self)
+ self._notifier = core.QSocketNotifier(cast(sip.voidptr, fd),
+ core.QSocketNotifier.Type.Read, self)
self._notifier.activated.connect(self.read_line)
- @pyqtSlot()
+ @core.pyqtSlot()
def read_line(self):
"""(Try to) read a line from the FIFO."""
log.procs.debug("QSocketNotifier triggered!")
@@ -91,7 +89,7 @@ class _QtFIFOReader(QObject):
self._fifo.close()
-class _BaseUserscriptRunner(QObject):
+class _BaseUserscriptRunner(core.QObject):
"""Common part between the Windows and the POSIX userscript runners.
@@ -110,8 +108,8 @@ class _BaseUserscriptRunner(QObject):
arg: The finished GUIProcess object.
"""
- got_cmd = pyqtSignal(str)
- finished = pyqtSignal(guiprocess.GUIProcess)
+ got_cmd = core.pyqtSignal(str)
+ finished = core.pyqtSignal(guiprocess.GUIProcess)
def __init__(self, parent=None):
super().__init__(parent)
@@ -216,7 +214,7 @@ class _BaseUserscriptRunner(QObject):
"""
raise NotImplementedError
- @pyqtSlot()
+ @core.pyqtSlot()
def on_proc_finished(self):
"""Called when the process has finished.
@@ -224,7 +222,7 @@ class _BaseUserscriptRunner(QObject):
"""
raise NotImplementedError
- @pyqtSlot()
+ @core.pyqtSlot()
def on_proc_error(self):
"""Called when the process encountered an error.
@@ -270,11 +268,11 @@ class _POSIXUserscriptRunner(_BaseUserscriptRunner):
self._reader = _QtFIFOReader(self._filepath)
self._reader.got_line.connect(self.got_cmd)
- @pyqtSlot()
+ @core.pyqtSlot()
def on_proc_finished(self):
self._cleanup()
- @pyqtSlot()
+ @core.pyqtSlot()
def on_proc_error(self):
self._cleanup()
@@ -327,11 +325,11 @@ class _WindowsUserscriptRunner(_BaseUserscriptRunner):
super()._cleanup()
self.finished.emit(proc)
- @pyqtSlot()
+ @core.pyqtSlot()
def on_proc_error(self):
self._cleanup()
- @pyqtSlot()
+ @core.pyqtSlot()
def on_proc_finished(self):
"""Read back the commands when the process finished."""
self._cleanup()
diff --git a/qutebrowser/completion/completer.py b/qutebrowser/completion/completer.py
index f8d69cc8f..6570218d8 100644
--- a/qutebrowser/completion/completer.py
+++ b/qutebrowser/completion/completer.py
@@ -22,14 +22,14 @@
import dataclasses
from typing import TYPE_CHECKING
-from qutebrowser.qt.core import pyqtSlot, QObject, QTimer
-
from qutebrowser.config import config
from qutebrowser.commands import parser, cmdexc
from qutebrowser.misc import objects, split
from qutebrowser.utils import log, utils, debug, objreg
from qutebrowser.completion.models import miscmodels
from qutebrowser.completion import completionwidget
+from qutebrowser.qt import core
+
if TYPE_CHECKING:
from qutebrowser.browser import browsertab
@@ -46,7 +46,7 @@ class CompletionInfo:
cur_tab: 'browsertab.AbstractTab'
-class Completer(QObject):
+class Completer(core.QObject):
"""Completer which manages completions in a CompletionView.
@@ -64,7 +64,7 @@ class Completer(QObject):
super().__init__(parent)
self._cmd = cmd
self._win_id = win_id
- self._timer = QTimer()
+ self._timer = core.QTimer()
self._timer.setSingleShot(True)
self._timer.setInterval(0)
self._timer.timeout.connect(self._update_completion)
@@ -174,7 +174,7 @@ class Completer(QObject):
raise utils.Unreachable(f"Not all parts consumed: {parts}")
- @pyqtSlot(str)
+ @core.pyqtSlot(str)
def on_selection_changed(self, text):
"""Change the completed part if a new item was selected.
@@ -207,7 +207,7 @@ class Completer(QObject):
else:
self._change_completed_part(text, before, after)
- @pyqtSlot()
+ @core.pyqtSlot()
def schedule_completion_update(self):
"""Schedule updating/enabling completion.
@@ -235,7 +235,7 @@ class Completer(QObject):
self._last_cursor_pos = self._cmd.cursorPosition()
self._last_text = self._cmd.text()
- @pyqtSlot()
+ @core.pyqtSlot()
def _update_completion(self):
"""Check if completions are available and activate them."""
completion = self._completion()
diff --git a/qutebrowser/completion/completiondelegate.py b/qutebrowser/completion/completiondelegate.py
index f6fec39f6..77858fca0 100644
--- a/qutebrowser/completion/completiondelegate.py
+++ b/qutebrowser/completion/completiondelegate.py
@@ -25,28 +25,23 @@ We use this to be able to highlight parts of the text.
import re
import html
-from qutebrowser.qt.widgets import QStyle, QStyleOptionViewItem, QStyledItemDelegate
-from qutebrowser.qt.core import QRectF, QRegularExpression, QSize, Qt
-from qutebrowser.qt.gui import (QIcon, QPalette, QTextDocument, QTextOption,
- QAbstractTextDocumentLayout, QSyntaxHighlighter,
- QTextCharFormat)
-
from qutebrowser.config import config
from qutebrowser.utils import qtutils
from qutebrowser.completion import completionwidget
+from qutebrowser.qt import widgets, gui, core
-class _Highlighter(QSyntaxHighlighter):
+class _Highlighter(gui.QSyntaxHighlighter):
def __init__(self, doc, pattern, color):
super().__init__(doc)
- self._format = QTextCharFormat()
+ self._format = gui.QTextCharFormat()
self._format.setForeground(color)
words = pattern.split()
words.sort(key=len, reverse=True)
pat = "|".join(re.escape(word) for word in words)
- self._expression = QRegularExpression(
- pat, QRegularExpression.PatternOption.CaseInsensitiveOption
+ self._expression = core.QRegularExpression(
+ pat, core.QRegularExpression.PatternOption.CaseInsensitiveOption
)
qtutils.ensure_valid(self._expression)
@@ -62,7 +57,7 @@ class _Highlighter(QSyntaxHighlighter):
)
-class CompletionItemDelegate(QStyledItemDelegate):
+class CompletionItemDelegate(widgets.QStyledItemDelegate):
"""Delegate used by CompletionView to draw individual items.
@@ -95,7 +90,7 @@ class CompletionItemDelegate(QStyledItemDelegate):
"""Draw the background of an ItemViewItem."""
assert self._opt is not None
assert self._style is not None
- self._style.drawPrimitive(QStyle.PrimitiveElement.PE_PanelItemViewItem, self._opt,
+ self._style.drawPrimitive(widgets.QStyle.PrimitiveElement.PE_PanelItemViewItem, self._opt,
self._painter, self._opt.widget)
def _draw_icon(self):
@@ -104,18 +99,18 @@ class CompletionItemDelegate(QStyledItemDelegate):
assert self._style is not None
icon_rect = self._style.subElementRect(
- QStyle.SubElement.SE_ItemViewItemDecoration, self._opt, self._opt.widget)
+ widgets.QStyle.SubElement.SE_ItemViewItemDecoration, self._opt, self._opt.widget)
if not icon_rect.isValid():
# The rect seems to be wrong in all kind of ways if no icon should
# be displayed.
return
- mode = QIcon.Mode.Normal
- if not self._opt.state & QStyle.StateFlag.State_Enabled:
- mode = QIcon.Mode.Disabled
- elif self._opt.state & QStyle.StateFlag.State_Selected:
- mode = QIcon.Mode.Selected
- state = QIcon.State.On if self._opt.state & QStyle.StateFlag.State_Open else QIcon.State.Off
+ mode = gui.QIcon.Mode.Normal
+ if not self._opt.state & widgets.QStyle.StateFlag.State_Enabled:
+ mode = gui.QIcon.Mode.Disabled
+ elif self._opt.state & widgets.QStyle.StateFlag.State_Selected:
+ mode = gui.QIcon.Mode.Selected
+ state = gui.QIcon.State.On if self._opt.state & widgets.QStyle.StateFlag.State_Open else gui.QIcon.State.Off
self._opt.icon.paint(self._painter, icon_rect,
self._opt.decorationAlignment, mode, state)
@@ -135,9 +130,9 @@ class CompletionItemDelegate(QStyledItemDelegate):
return
text_rect_ = self._style.subElementRect(
- QStyle.SubElement.SE_ItemViewItemText, self._opt, self._opt.widget)
+ widgets.QStyle.SubElement.SE_ItemViewItemText, self._opt, self._opt.widget)
qtutils.ensure_valid(text_rect_)
- margin = self._style.pixelMetric(QStyle.PixelMetric.PM_FocusFrameHMargin,
+ margin = self._style.pixelMetric(widgets.QStyle.PixelMetric.PM_FocusFrameHMargin,
self._opt, self._opt.widget) + 1
# remove width padding
text_rect = text_rect_.adjusted(margin, 0, -margin, 0)
@@ -149,24 +144,24 @@ class CompletionItemDelegate(QStyledItemDelegate):
text_rect.adjust(0, -2, 0, -2)
self._painter.save()
state = self._opt.state
- if state & QStyle.StateFlag.State_Enabled and state & QStyle.StateFlag.State_Active:
- cg = QPalette.ColorGroup.Normal
- elif state & QStyle.StateFlag.State_Enabled:
- cg = QPalette.ColorGroup.Inactive
+ if state & widgets.QStyle.StateFlag.State_Enabled and state & widgets.QStyle.StateFlag.State_Active:
+ cg = gui.QPalette.ColorGroup.Normal
+ elif state & widgets.QStyle.StateFlag.State_Enabled:
+ cg = gui.QPalette.ColorGroup.Inactive
else:
- cg = QPalette.ColorGroup.Disabled
+ cg = gui.QPalette.ColorGroup.Disabled
- if state & QStyle.StateFlag.State_Selected:
+ if state & widgets.QStyle.StateFlag.State_Selected:
self._painter.setPen(self._opt.palette.color(
- cg, QPalette.ColorRole.HighlightedText))
+ cg, gui.QPalette.ColorRole.HighlightedText))
# This is a dirty fix for the text jumping by one pixel for
# whatever reason.
text_rect.adjust(0, -1, 0, 0)
else:
- self._painter.setPen(self._opt.palette.color(cg, QPalette.ColorRole.Text))
+ self._painter.setPen(self._opt.palette.color(cg, gui.QPalette.ColorRole.Text))
- if state & QStyle.StateFlag.State_Editing:
- self._painter.setPen(self._opt.palette.color(cg, QPalette.ColorRole.Text))
+ if state & widgets.QStyle.StateFlag.State_Editing:
+ self._painter.setPen(self._opt.palette.color(cg, gui.QPalette.ColorRole.Text))
self._painter.drawRect(text_rect_.adjusted(0, 0, -1, -1))
self._painter.translate(text_rect.left(), text_rect.top())
@@ -185,12 +180,12 @@ class CompletionItemDelegate(QStyledItemDelegate):
assert self._opt is not None
# We can't use drawContents because then the color would be ignored.
- clip = QRectF(0, 0, rect.width(), rect.height())
+ clip = core.QRectF(0, 0, rect.width(), rect.height())
self._painter.save()
- if self._opt.state & QStyle.StateFlag.State_Selected:
+ if self._opt.state & widgets.QStyle.StateFlag.State_Selected:
color = config.cache['colors.completion.item.selected.fg']
- elif not self._opt.state & QStyle.StateFlag.State_Enabled:
+ elif not self._opt.state & widgets.QStyle.StateFlag.State_Enabled:
color = config.cache['colors.completion.category.fg']
else:
colors = config.cache['colors.completion.fg']
@@ -198,8 +193,8 @@ class CompletionItemDelegate(QStyledItemDelegate):
color = colors[col % len(colors)]
self._painter.setPen(color)
- ctx = QAbstractTextDocumentLayout.PaintContext()
- ctx.palette.setColor(QPalette.ColorRole.Text, self._painter.pen().color())
+ ctx = gui.QAbstractTextDocumentLayout.PaintContext()
+ ctx.palette.setColor(gui.QPalette.ColorRole.Text, self._painter.pen().color())
if clip.isValid():
self._painter.setClipRect(clip)
ctx.clip = clip
@@ -216,18 +211,18 @@ class CompletionItemDelegate(QStyledItemDelegate):
# FIXME we probably should do eliding here. See
# qcommonstyle.cpp:viewItemDrawText
# https://github.com/qutebrowser/qutebrowser/issues/118
- text_option = QTextOption()
- if self._opt.features & QStyleOptionViewItem.ViewItemFeature.WrapText:
- text_option.setWrapMode(QTextOption.WrapMode.WordWrap)
+ text_option = gui.QTextOption()
+ if self._opt.features & widgets.QStyleOptionViewItem.ViewItemFeature.WrapText:
+ text_option.setWrapMode(gui.QTextOption.WrapMode.WordWrap)
else:
- text_option.setWrapMode(QTextOption.WrapMode.ManualWrap)
+ text_option.setWrapMode(gui.QTextOption.WrapMode.ManualWrap)
text_option.setTextDirection(self._opt.direction)
- text_option.setAlignment(QStyle.visualAlignment(
+ text_option.setAlignment(widgets.QStyle.visualAlignment(
self._opt.direction, self._opt.displayAlignment))
if self._doc is not None:
self._doc.deleteLater()
- self._doc = QTextDocument(self)
+ self._doc = gui.QTextDocument(self)
self._doc.setDefaultFont(self._opt.font)
self._doc.setDefaultTextOption(text_option)
self._doc.setDocumentMargin(2)
@@ -238,7 +233,7 @@ class CompletionItemDelegate(QStyledItemDelegate):
pattern = view.pattern
columns_to_filter = index.model().columns_to_filter(index)
if index.column() in columns_to_filter and pattern:
- if self._opt.state & QStyle.StateFlag.State_Selected:
+ if self._opt.state & widgets.QStyle.StateFlag.State_Selected:
color = config.val.colors.completion.item.selected.match.fg
else:
color = config.val.colors.completion.match.fg
@@ -255,23 +250,23 @@ class CompletionItemDelegate(QStyledItemDelegate):
assert self._opt is not None
assert self._style is not None
state = self._opt.state
- if not state & QStyle.StateFlag.State_HasFocus:
+ if not state & widgets.QStyle.StateFlag.State_HasFocus:
return
o = self._opt
o.rect = self._style.subElementRect(
- QStyle.SubElement.SE_ItemViewItemFocusRect, self._opt, self._opt.widget)
- o.state |= QStyle.StateFlag.State_KeyboardFocusChange | QStyle.StateFlag.State_Item
+ widgets.QStyle.SubElement.SE_ItemViewItemFocusRect, self._opt, self._opt.widget)
+ o.state |= widgets.QStyle.StateFlag.State_KeyboardFocusChange | widgets.QStyle.StateFlag.State_Item
qtutils.ensure_valid(o.rect)
- if state & QStyle.StateFlag.State_Enabled:
- cg = QPalette.ColorGroup.Normal
+ if state & widgets.QStyle.StateFlag.State_Enabled:
+ cg = gui.QPalette.ColorGroup.Normal
else:
- cg = QPalette.ColorGroup.Disabled
- if state & QStyle.StateFlag.State_Selected:
- role = QPalette.ColorRole.Highlight
+ cg = gui.QPalette.ColorGroup.Disabled
+ if state & widgets.QStyle.StateFlag.State_Selected:
+ role = gui.QPalette.ColorRole.Highlight
else:
- role = QPalette.ColorRole.Window
+ role = gui.QPalette.ColorRole.Window
o.backgroundColor = self._opt.palette.color(cg, role)
- self._style.drawPrimitive(QStyle.PrimitiveElement.PE_FrameFocusRect, o, self._painter,
+ self._style.drawPrimitive(widgets.QStyle.PrimitiveElement.PE_FrameFocusRect, o, self._painter,
self._opt.widget)
def sizeHint(self, option, index):
@@ -287,10 +282,10 @@ class CompletionItemDelegate(QStyledItemDelegate):
Return:
A QSize with the recommended size.
"""
- value = index.data(Qt.ItemDataRole.SizeHintRole)
+ value = index.data(core.Qt.ItemDataRole.SizeHintRole)
if value is not None:
return value
- self._opt = QStyleOptionViewItem(option)
+ self._opt = widgets.QStyleOptionViewItem(option)
self.initStyleOption(self._opt, index)
self._style = self._opt.widget.style()
@@ -298,10 +293,10 @@ class CompletionItemDelegate(QStyledItemDelegate):
assert self._doc is not None
docsize = self._doc.size().toSize()
- size = self._style.sizeFromContents(QStyle.ContentsType.CT_ItemViewItem, self._opt,
+ size = self._style.sizeFromContents(widgets.QStyle.ContentsType.CT_ItemViewItem, self._opt,
docsize, self._opt.widget)
qtutils.ensure_valid(size)
- return size + QSize(10, 3)
+ return size + core.QSize(10, 3)
def paint(self, painter, option, index):
"""Override the QStyledItemDelegate paint function.
@@ -313,7 +308,7 @@ class CompletionItemDelegate(QStyledItemDelegate):
"""
self._painter = painter
self._painter.save()
- self._opt = QStyleOptionViewItem(option)
+ self._opt = widgets.QStyleOptionViewItem(option)
self.initStyleOption(self._opt, index)
self._style = self._opt.widget.style()
diff --git a/qutebrowser/completion/completionwidget.py b/qutebrowser/completion/completionwidget.py
index c137f1141..61f058ba7 100644
--- a/qutebrowser/completion/completionwidget.py
+++ b/qutebrowser/completion/completionwidget.py
@@ -25,19 +25,18 @@ subclasses to provide completions.
from typing import TYPE_CHECKING, Optional
-from qutebrowser.qt.widgets import QTreeView, QSizePolicy, QStyleFactory, QWidget
-from qutebrowser.qt.core import pyqtSlot, pyqtSignal, Qt, QItemSelectionModel, QSize
-
from qutebrowser.config import config, stylesheet
from qutebrowser.completion import completiondelegate
from qutebrowser.completion.models import completionmodel
from qutebrowser.utils import utils, usertypes, debug, log, qtutils
from qutebrowser.api import cmdutils
+from qutebrowser.qt import widgets, core
+
if TYPE_CHECKING:
from qutebrowser.mainwindow.statusbar import command
-class CompletionView(QTreeView):
+class CompletionView(widgets.QTreeView):
"""The view showing available completions.
@@ -108,13 +107,13 @@ class CompletionView(QTreeView):
}
"""
- update_geometry = pyqtSignal()
- selection_changed = pyqtSignal(str)
+ update_geometry = core.pyqtSignal()
+ selection_changed = core.pyqtSignal(str)
def __init__(self, *,
cmd: 'command.Command',
win_id: int,
- parent: QWidget = None) -> None:
+ parent: widgets.QWidget = None) -> None:
super().__init__(parent)
self.pattern: Optional[str] = None
self._win_id = win_id
@@ -125,16 +124,16 @@ class CompletionView(QTreeView):
self._delegate = completiondelegate.CompletionItemDelegate(self)
self.setItemDelegate(self._delegate)
- self.setStyle(QStyleFactory.create('Fusion'))
+ self.setStyle(widgets.QStyleFactory.create('Fusion'))
stylesheet.set_register(self)
- self.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed)
+ self.setSizePolicy(widgets.QSizePolicy.Policy.Expanding, widgets.QSizePolicy.Policy.Fixed)
self.setHeaderHidden(True)
self.setAlternatingRowColors(True)
self.setIndentation(0)
self.setItemsExpandable(False)
self.setExpandsOnDoubleClick(False)
self.setAnimated(False)
- self.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
+ self.setHorizontalScrollBarPolicy(core.Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
# WORKAROUND
# This is a workaround for weird race conditions with invalid
# item indexes leading to segfaults in Qt.
@@ -158,7 +157,7 @@ class CompletionView(QTreeView):
assert isinstance(model, completionmodel.CompletionModel), model
return model
- @pyqtSlot(str)
+ @core.pyqtSlot(str)
def _on_config_changed(self, option):
if option in ['completion.height', 'completion.shrink']:
self.update_geometry.emit()
@@ -341,8 +340,8 @@ class CompletionView(QTreeView):
selmodel.setCurrentIndex(
idx,
- QItemSelectionModel.SelectionFlag.ClearAndSelect |
- QItemSelectionModel.SelectionFlag.Rows)
+ core.QItemSelectionModel.SelectionFlag.ClearAndSelect |
+ core.QItemSelectionModel.SelectionFlag.Rows)
# if the last item is focused, try to fetch more
next_idx = self.indexBelow(idx)
@@ -413,7 +412,7 @@ class CompletionView(QTreeView):
if config.val.completion.shrink:
self.update_geometry.emit()
- @pyqtSlot()
+ @core.pyqtSlot()
def on_clear_completion_selection(self):
"""Clear the selection model when an item is activated."""
self.hide()
@@ -439,7 +438,7 @@ class CompletionView(QTreeView):
if contents_height <= height:
height = contents_height
# The width isn't really relevant as we're expanding anyways.
- return QSize(-1, height)
+ return core.QSize(-1, height)
def selectionChanged(self, selected, deselected):
"""Extend selectionChanged to call completers selection_changed."""
diff --git a/qutebrowser/completion/models/completionmodel.py b/qutebrowser/completion/models/completionmodel.py
index ea491612a..d93e5bfdc 100644
--- a/qutebrowser/completion/models/completionmodel.py
+++ b/qutebrowser/completion/models/completionmodel.py
@@ -21,13 +21,12 @@
from typing import MutableSequence
-from qutebrowser.qt.core import Qt, QModelIndex, QAbstractItemModel
-
from qutebrowser.utils import log, qtutils, utils
from qutebrowser.api import cmdutils
+from qutebrowser.qt import core
-class CompletionModel(QAbstractItemModel):
+class CompletionModel(core.QAbstractItemModel):
"""A model that proxies access to one or more completion categories.
@@ -43,7 +42,7 @@ class CompletionModel(QAbstractItemModel):
def __init__(self, *, column_widths=(30, 70, 0), parent=None):
super().__init__(parent)
self.column_widths = column_widths
- self._categories: MutableSequence[QAbstractItemModel] = []
+ self._categories: MutableSequence[core.QAbstractItemModel] = []
def _cat_from_idx(self, index):
"""Return the category pointed to by the given index.
@@ -63,7 +62,7 @@ class CompletionModel(QAbstractItemModel):
"""Add a completion category to the model."""
self._categories.append(cat)
- def data(self, index, role=Qt.ItemDataRole.DisplayRole):
+ def data(self, index, role=core.Qt.ItemDataRole.DisplayRole):
"""Return the item data for index.
Override QAbstractItemModel::data.
@@ -74,7 +73,7 @@ class CompletionModel(QAbstractItemModel):
Return: The item data, or None on an invalid index.
"""
- if role != Qt.ItemDataRole.DisplayRole:
+ if role != core.Qt.ItemDataRole.DisplayRole:
return None
cat = self._cat_from_idx(index)
if cat:
@@ -97,16 +96,16 @@ class CompletionModel(QAbstractItemModel):
Return: The item flags, or Qt.ItemFlag.NoItemFlags on error.
"""
if not index.isValid():
- return Qt.ItemFlag.NoItemFlags
+ return core.Qt.ItemFlag.NoItemFlags
if index.parent().isValid():
# item
- return (Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsSelectable |
- Qt.ItemFlag.ItemNeverHasChildren)
+ return (core.Qt.ItemFlag.ItemIsEnabled | core.Qt.ItemFlag.ItemIsSelectable |
+ core.Qt.ItemFlag.ItemNeverHasChildren)
else:
# category
- return Qt.ItemFlag.NoItemFlags
+ return core.Qt.ItemFlag.NoItemFlags
- def index(self, row, col, parent=QModelIndex()):
+ def index(self, row, col, parent=core.QModelIndex()):
"""Get an index into the model.
Override QAbstractItemModel::index.
@@ -115,10 +114,10 @@ class CompletionModel(QAbstractItemModel):
"""
if (row < 0 or row >= self.rowCount(parent) or
col < 0 or col >= self.columnCount(parent)):
- return QModelIndex()
+ return core.QModelIndex()
if parent.isValid():
if parent.column() != 0:
- return QModelIndex()
+ return core.QModelIndex()
# store a pointer to the parent category in internalPointer
return self.createIndex(row, col, self._categories[parent.row()])
return self.createIndex(row, col, None)
@@ -134,11 +133,11 @@ class CompletionModel(QAbstractItemModel):
parent_cat = index.internalPointer()
if not parent_cat:
# categories have no parent
- return QModelIndex()
+ return core.QModelIndex()
row = self._categories.index(parent_cat)
return self.createIndex(row, 0, None)
- def rowCount(self, parent=QModelIndex()):
+ def rowCount(self, parent=core.QModelIndex()):
"""Override QAbstractItemModel::rowCount."""
if not parent.isValid():
# top-level
@@ -151,7 +150,7 @@ class CompletionModel(QAbstractItemModel):
# category
return cat.rowCount()
- def columnCount(self, parent=QModelIndex()):
+ def columnCount(self, parent=core.QModelIndex()):
"""Override QAbstractItemModel::columnCount."""
utils.unused(parent)
return len(self.column_widths)
@@ -160,14 +159,14 @@ class CompletionModel(QAbstractItemModel):
"""Override to forward the call to the categories."""
cat = self._cat_from_idx(parent)
if cat:
- return cat.canFetchMore(QModelIndex())
+ return cat.canFetchMore(core.QModelIndex())
return False
def fetchMore(self, parent):
"""Override to forward the call to the categories."""
cat = self._cat_from_idx(parent)
if cat:
- cat.fetchMore(QModelIndex())
+ cat.fetchMore(core.QModelIndex())
def count(self):
"""Return the count of non-category items."""
@@ -194,7 +193,7 @@ class CompletionModel(QAbstractItemModel):
index = self.index(0, 0, parent)
qtutils.ensure_valid(index)
return index
- return QModelIndex()
+ return core.QModelIndex()
def last_item(self):
"""Return the index of the last child (non-category) in the model."""
@@ -205,7 +204,7 @@ class CompletionModel(QAbstractItemModel):
index = self.index(childcount - 1, 0, parent)
qtutils.ensure_valid(index)
return index
- return QModelIndex()
+ return core.QModelIndex()
def columns_to_filter(self, index):
"""Return the column indices the filter pattern applies to.
@@ -232,5 +231,5 @@ class CompletionModel(QAbstractItemModel):
cat.delete_func(data)
self.beginRemoveRows(parent, index.row(), index.row())
- cat.removeRow(index.row(), QModelIndex())
+ cat.removeRow(index.row(), core.QModelIndex())
self.endRemoveRows()
diff --git a/qutebrowser/completion/models/filepathcategory.py b/qutebrowser/completion/models/filepathcategory.py
index 3bf241c30..6d3123547 100644
--- a/qutebrowser/completion/models/filepathcategory.py
+++ b/qutebrowser/completion/models/filepathcategory.py
@@ -31,16 +31,15 @@ import os
import os.path
from typing import List, Optional, Iterable
-from qutebrowser.qt.core import QAbstractListModel, QModelIndex, QObject, Qt, QUrl
-
from qutebrowser.config import config
from qutebrowser.utils import log
+from qutebrowser.qt import core
-class FilePathCategory(QAbstractListModel):
+class FilePathCategory(core.QAbstractListModel):
"""Represent filesystem paths matching a pattern."""
- def __init__(self, name: str, parent: QObject = None) -> None:
+ def __init__(self, name: str, parent: core.QObject = None) -> None:
super().__init__(parent)
self._paths: List[str] = []
self.name = name
@@ -71,7 +70,7 @@ class FilePathCategory(QAbstractListModel):
def _url_to_path(self, val: str) -> str:
"""Get a path from a file:/// URL."""
- url = QUrl(val)
+ url = core.QUrl(val)
assert url.isValid(), url
assert url.scheme() == 'file', url
return url.toLocalFile()
@@ -87,7 +86,7 @@ class FilePathCategory(QAbstractListModel):
elif val.startswith('file:///'):
url_path = self._url_to_path(val)
self._paths = sorted(
- QUrl.fromLocalFile(path).toString()
+ core.QUrl.fromLocalFile(path).toString()
for path in self._glob(url_path)
)
else:
@@ -100,13 +99,13 @@ class FilePathCategory(QAbstractListModel):
paths = self._glob(expanded)
self._paths = sorted(self._contract_user(val, path) for path in paths)
- def data(self, index: QModelIndex, role: int = Qt.ItemDataRole.DisplayRole) -> Optional[str]:
+ def data(self, index: core.QModelIndex, role: int = core.Qt.ItemDataRole.DisplayRole) -> Optional[str]:
"""Implement abstract method in QAbstractListModel."""
- if role == Qt.ItemDataRole.DisplayRole and index.column() == 0:
+ if role == core.Qt.ItemDataRole.DisplayRole and index.column() == 0:
return self._paths[index.row()]
return None
- def rowCount(self, parent: QModelIndex = QModelIndex()) -> int:
+ def rowCount(self, parent: core.QModelIndex = core.QModelIndex()) -> int:
"""Implement abstract method in QAbstractListModel."""
if parent.isValid():
return 0
diff --git a/qutebrowser/completion/models/histcategory.py b/qutebrowser/completion/models/histcategory.py
index fa5c5f2aa..43befcbfc 100644
--- a/qutebrowser/completion/models/histcategory.py
+++ b/qutebrowser/completion/models/histcategory.py
@@ -21,8 +21,7 @@
from typing import Optional
-from qutebrowser.qt.sql import QSqlQueryModel
-from qutebrowser.qt.widgets import QWidget
+from qutebrowser.qt import widgets, sql
from qutebrowser.misc import sql
from qutebrowser.utils import debug, message, log
@@ -30,13 +29,13 @@ from qutebrowser.config import config
from qutebrowser.completion.models import util
-class HistoryCategory(QSqlQueryModel):
+class HistoryCategory(sql.QSqlQueryModel):
"""A completion category that queries the SQL history store."""
def __init__(self, *, database: sql.Database,
delete_func: util.DeleteFuncType = None,
- parent: QWidget = None) -> None:
+ parent: widgets.QWidget = None) -> None:
"""Create a new History completion category."""
super().__init__(parent=parent)
self._database = database
diff --git a/qutebrowser/completion/models/listcategory.py b/qutebrowser/completion/models/listcategory.py
index e6756c1a3..d40d68fd5 100644
--- a/qutebrowser/completion/models/listcategory.py
+++ b/qutebrowser/completion/models/listcategory.py
@@ -21,16 +21,14 @@
import re
from typing import Iterable, Tuple
-
-from qutebrowser.qt.core import QSortFilterProxyModel, QRegularExpression
-from qutebrowser.qt.gui import QStandardItem, QStandardItemModel
-from qutebrowser.qt.widgets import QWidget
+from qutebrowser.qt import widgets
from qutebrowser.completion.models import util
from qutebrowser.utils import qtutils, log
+from qutebrowser.qt import gui, core
-class ListCategory(QSortFilterProxyModel):
+class ListCategory(core.QSortFilterProxyModel):
"""Expose a list of items as a category for the CompletionModel."""
@@ -39,16 +37,16 @@ class ListCategory(QSortFilterProxyModel):
items: Iterable[Tuple[str, ...]],
sort: bool = True,
delete_func: util.DeleteFuncType = None,
- parent: QWidget = None):
+ parent: widgets.QWidget = None):
super().__init__(parent)
self.name = name
- self.srcmodel = QStandardItemModel(parent=self)
+ self.srcmodel = gui.QStandardItemModel(parent=self)
self._pattern = ''
# ListCategory filters all columns
self.columns_to_filter = [0, 1, 2]
self.setFilterKeyColumn(-1)
for item in items:
- self.srcmodel.appendRow([QStandardItem(x) for x in item])
+ self.srcmodel.appendRow([gui.QStandardItem(x) for x in item])
self.setSourceModel(self.srcmodel)
self.delete_func = delete_func
self._sort = sort
@@ -66,7 +64,7 @@ class ListCategory(QSortFilterProxyModel):
val = re.sub(r' +', r' ', val) # See #1919
val = re.escape(val)
val = val.replace(r'\ ', '.*')
- rx = QRegularExpression(val, QRegularExpression.PatternOption.CaseInsensitiveOption)
+ rx = core.QRegularExpression(val, core.QRegularExpression.PatternOption.CaseInsensitiveOption)
qtutils.ensure_valid(rx)
self.setFilterRegularExpression(rx)
self.invalidate()
diff --git a/qutebrowser/completion/models/urlmodel.py b/qutebrowser/completion/models/urlmodel.py
index f64e0b570..4f90615c1 100644
--- a/qutebrowser/completion/models/urlmodel.py
+++ b/qutebrowser/completion/models/urlmodel.py
@@ -21,7 +21,7 @@
from typing import Dict, Sequence
-from qutebrowser.qt.core import QAbstractItemModel
+from qutebrowser.qt import core
from qutebrowser.completion.models import (completionmodel, filepathcategory,
listcategory, histcategory)
@@ -74,7 +74,7 @@ def url(*, info):
in sorted(config.val.url.searchengines.items())
if k != 'DEFAULT']
categories = config.val.completion.open_categories
- models: Dict[str, QAbstractItemModel] = {}
+ models: Dict[str, core.QAbstractItemModel] = {}
if searchengines and 'searchengines' in categories:
models['searchengines'] = listcategory.ListCategory(
diff --git a/qutebrowser/components/braveadblock.py b/qutebrowser/components/braveadblock.py
index 8df0eb1c5..5484d6a18 100644
--- a/qutebrowser/components/braveadblock.py
+++ b/qutebrowser/components/braveadblock.py
@@ -27,7 +27,7 @@ import contextlib
import subprocess
from typing import Optional, IO, Iterator
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import core
from qutebrowser.api import (
hook,
@@ -185,8 +185,8 @@ class BraveAdBlocker:
def _is_blocked(
self,
- request_url: QUrl,
- first_party_url: Optional[QUrl] = None,
+ request_url: core.QUrl,
+ first_party_url: Optional[core.QUrl] = None,
resource_type: Optional[interceptor.ResourceType] = None,
) -> bool:
"""Check whether the given request is blocked."""
diff --git a/qutebrowser/components/hostblock.py b/qutebrowser/components/hostblock.py
index f364269d6..2f7c54298 100644
--- a/qutebrowser/components/hostblock.py
+++ b/qutebrowser/components/hostblock.py
@@ -26,7 +26,7 @@ import logging
import pathlib
from typing import cast, IO, Set
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import core
from qutebrowser.api import (
hook,
@@ -115,7 +115,7 @@ class HostBlocker:
self._config_hosts_file = str(config_dir / "blocked-hosts")
- def _is_blocked(self, request_url: QUrl, first_party_url: QUrl = None) -> bool:
+ def _is_blocked(self, request_url: core.QUrl, first_party_url: core.QUrl = None) -> bool:
"""Check whether the given request is blocked."""
if not self.enabled:
return False
diff --git a/qutebrowser/components/misccommands.py b/qutebrowser/components/misccommands.py
index c31ec5e6c..ca730510a 100644
--- a/qutebrowser/components/misccommands.py
+++ b/qutebrowser/components/misccommands.py
@@ -34,8 +34,7 @@ try:
except ImportError:
hunter = None
-from qutebrowser.qt.core import Qt
-from qutebrowser.qt.printsupport import QPrintPreviewDialog
+from qutebrowser.qt import printsupport, core
from qutebrowser.api import cmdutils, apitypes, message, config
@@ -80,12 +79,12 @@ def _print_preview(tab: apitypes.Tab) -> None:
message.error("Printing failed!")
tab.printing.check_preview_support()
- diag = QPrintPreviewDialog(tab)
- diag.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose)
+ diag = printsupport.QPrintPreviewDialog(tab)
+ diag.setAttribute(core.Qt.WidgetAttribute.WA_DeleteOnClose)
diag.setWindowFlags(
diag.windowFlags() |
- Qt.WindowType.WindowMaximizeButtonHint |
- Qt.WindowType.WindowMinimizeButtonHint)
+ core.Qt.WindowType.WindowMaximizeButtonHint |
+ core.Qt.WindowType.WindowMinimizeButtonHint)
diag.paintRequested.connect(functools.partial(
tab.printing.to_printer, callback=print_callback))
diag.exec()
diff --git a/qutebrowser/components/readlinecommands.py b/qutebrowser/components/readlinecommands.py
index f6ee31e84..b8845433b 100644
--- a/qutebrowser/components/readlinecommands.py
+++ b/qutebrowser/components/readlinecommands.py
@@ -22,9 +22,8 @@
import os
from typing import Iterable, Optional, MutableMapping, Any, Callable
-from qutebrowser.qt.widgets import QApplication, QLineEdit
-
from qutebrowser.api import cmdutils
+from qutebrowser.qt import widgets
class _ReadlineBridge:
@@ -36,16 +35,16 @@ class _ReadlineBridge:
"""
def __init__(self) -> None:
- self._deleted: MutableMapping[QLineEdit, str] = {}
+ self._deleted: MutableMapping[widgets.QLineEdit, str] = {}
- def _widget(self) -> Optional[QLineEdit]:
+ def _widget(self) -> Optional[widgets.QLineEdit]:
"""Get the currently active QLineEdit."""
# FIXME add this to api.utils or so
- qapp = QApplication.instance()
- assert isinstance(qapp, QApplication), qapp
+ qapp = widgets.QApplication.instance()
+ assert isinstance(qapp, widgets.QApplication), qapp
w = qapp.focusWidget()
- if isinstance(w, QLineEdit):
+ if isinstance(w, widgets.QLineEdit):
return w
else:
return None
diff --git a/qutebrowser/components/utils/blockutils.py b/qutebrowser/components/utils/blockutils.py
index 828a87952..a78e3052f 100644
--- a/qutebrowser/components/utils/blockutils.py
+++ b/qutebrowser/components/utils/blockutils.py
@@ -24,9 +24,8 @@ import os
import functools
from typing import IO, List, Optional
-from qutebrowser.qt.core import QUrl, QObject, pyqtSignal
-
from qutebrowser.api import downloads, message, config
+from qutebrowser.qt import core
class FakeDownload(downloads.TempDownload):
@@ -39,7 +38,7 @@ class FakeDownload(downloads.TempDownload):
self.successful = True
-class BlocklistDownloads(QObject):
+class BlocklistDownloads(core.QObject):
"""Download blocklists from the given URLs.
Attributes:
@@ -60,10 +59,10 @@ class BlocklistDownloads(QObject):
_finished: Has `all_downloads_finished` been emitted?
"""
- single_download_finished = pyqtSignal(object) # arg: the file object
- all_downloads_finished = pyqtSignal(int) # arg: download count
+ single_download_finished = core.pyqtSignal(object) # arg: the file object
+ all_downloads_finished = core.pyqtSignal(int) # arg: download count
- def __init__(self, urls: List[QUrl], parent: Optional[QObject] = None) -> None:
+ def __init__(self, urls: List[core.QUrl], parent: Optional[core.QObject] = None) -> None:
super().__init__(parent)
self._urls = urls
@@ -95,7 +94,7 @@ class BlocklistDownloads(QObject):
self._finished = True
self.all_downloads_finished.emit(self._done_count)
- def _download_blocklist_url(self, url: QUrl) -> None:
+ def _download_blocklist_url(self, url: core.QUrl) -> None:
"""Take a blocklist url and queue it for download.
Args:
@@ -156,7 +155,7 @@ class BlocklistDownloads(QObject):
self.all_downloads_finished.emit(self._done_count)
-def is_whitelisted_url(url: QUrl) -> bool:
+def is_whitelisted_url(url: core.QUrl) -> bool:
"""Check if the given URL is on the adblock whitelist."""
whitelist = config.val.content.blocking.whitelist
return any(pattern.matches(url) for pattern in whitelist)
diff --git a/qutebrowser/config/config.py b/qutebrowser/config/config.py
index 278059820..a41adf947 100644
--- a/qutebrowser/config/config.py
+++ b/qutebrowser/config/config.py
@@ -25,13 +25,12 @@ import functools
from typing import (TYPE_CHECKING, Any, Callable, Dict, Iterator, List, Mapping,
MutableMapping, MutableSequence, Optional, Tuple, cast)
-from qutebrowser.qt.core import pyqtSignal, QObject, QUrl
-
from qutebrowser.commands import cmdexc, parser
from qutebrowser.config import configdata, configexc, configutils
from qutebrowser.utils import utils, log, urlmatch
from qutebrowser.misc import objects
from qutebrowser.keyinput import keyutils
+from qutebrowser.qt import core
if TYPE_CHECKING:
from qutebrowser.config import configcache, configfiles
@@ -282,7 +281,7 @@ class KeyConfig:
self._config.update_mutables(save_yaml=save_yaml)
-class Config(QObject):
+class Config(core.QObject):
"""Main config object.
@@ -300,11 +299,11 @@ class Config(QObject):
"""
MUTABLE_TYPES = (dict, list)
- changed = pyqtSignal(str)
+ changed = core.pyqtSignal(str)
def __init__(self,
yaml_config: 'configfiles.YamlConfig',
- parent: QObject = None) -> None:
+ parent: core.QObject = None) -> None:
super().__init__(parent)
self._mutables: MutableMapping[str, Tuple[Any, Any]] = {}
self._yaml = yaml_config
@@ -386,7 +385,7 @@ class Config(QObject):
def get(self,
name: str,
- url: QUrl = None, *,
+ url: core.QUrl = None, *,
fallback: bool = True) -> Any:
"""Get the given setting converted for Python code.
@@ -412,7 +411,7 @@ class Config(QObject):
def get_obj(self,
name: str, *,
- url: QUrl = None,
+ url: core.QUrl = None,
fallback: bool = True) -> Any:
"""Get the given setting as object (for YAML/config.py).
diff --git a/qutebrowser/config/configcommands.py b/qutebrowser/config/configcommands.py
index 2f5682e96..ee82d4409 100644
--- a/qutebrowser/config/configcommands.py
+++ b/qutebrowser/config/configcommands.py
@@ -23,14 +23,13 @@ import os.path
import contextlib
from typing import TYPE_CHECKING, Iterator, List, Optional, Any, Tuple
-from qutebrowser.qt.core import QUrl, QUrlQuery
-
from qutebrowser.api import cmdutils
from qutebrowser.completion.models import configmodel
from qutebrowser.utils import objreg, message, standarddir, urlmatch
from qutebrowser.config import configtypes, configexc, configfiles, configdata
from qutebrowser.misc import editor
from qutebrowser.keyinput import keyutils
+from qutebrowser.qt import core
if TYPE_CHECKING:
from qutebrowser.config.config import Config, KeyConfig
@@ -108,7 +107,7 @@ class ConfigCommands:
if option is None:
tabbed_browser = objreg.get('tabbed-browser', scope='window',
window=win_id)
- tabbed_browser.load_url(QUrl('qute://settings'), newtab=False)
+ tabbed_browser.load_url(core.QUrl('qute://settings'), newtab=False)
return
if option.endswith('!'):
@@ -151,7 +150,7 @@ class ConfigCommands:
default: If given, restore a default binding.
"""
if key is None:
- url = QUrl('qute://bindings')
+ url = core.QUrl('qute://bindings')
if mode != "normal":
url.setFragment(mode)
tabbed_browser = objreg.get('tabbed-browser', scope='window',
@@ -287,9 +286,9 @@ class ConfigCommands:
Args:
include_hidden: Also include internal qutebrowser settings.
"""
- url = QUrl('qute://configdiff')
+ url = core.QUrl('qute://configdiff')
if include_hidden:
- query = QUrlQuery()
+ query = core.QUrlQuery()
query.addQueryItem("include_hidden", "true")
url.setQuery(query)
diff --git a/qutebrowser/config/configfiles.py b/qutebrowser/config/configfiles.py
index acf2b8bb1..6df3b02a4 100644
--- a/qutebrowser/config/configfiles.py
+++ b/qutebrowser/config/configfiles.py
@@ -33,13 +33,13 @@ from typing import (TYPE_CHECKING, Any, Dict, Iterable, Iterator, List, Mapping,
MutableMapping, Optional, Tuple, cast)
import yaml
-from qutebrowser.qt.core import pyqtSignal, pyqtSlot, QObject, QSettings, qVersion
import qutebrowser
from qutebrowser.config import (configexc, config, configdata, configutils,
configtypes)
from qutebrowser.keyinput import keyutils
from qutebrowser.utils import standarddir, utils, qtutils, log, urlmatch, version
+from qutebrowser.qt import core
if TYPE_CHECKING:
from qutebrowser.misc import savemanager
@@ -110,7 +110,7 @@ class StateConfig(configparser.ConfigParser):
for sect, key in deleted_keys:
self[sect].pop(key, None)
- self['general']['qt_version'] = qVersion()
+ self['general']['qt_version'] = core.qVersion()
self['general']['qtwe_version'] = self._qtwe_version_str()
self['general']['chromium_version'] = self._chromium_version_str()
self['general']['version'] = qutebrowser.__version__
@@ -122,7 +122,7 @@ class StateConfig(configparser.ConfigParser):
"""
try:
# pylint: disable=unused-import,redefined-outer-name
- import qutebrowser.qt.webenginewidgets
+ import qutebrowser.qt
except ImportError:
return False
return True
@@ -158,7 +158,7 @@ class StateConfig(configparser.ConfigParser):
return
old_qt_version = self['general'].get('qt_version', None)
- self.qt_version_changed = old_qt_version != qVersion()
+ self.qt_version_changed = old_qt_version != core.qVersion()
old_qtwe_version = self['general'].get('qtwe_version', None)
self.qtwe_version_changed = old_qtwe_version != self._qtwe_version_str()
@@ -247,7 +247,7 @@ class StateConfig(configparser.ConfigParser):
self.write(f)
-class YamlConfig(QObject):
+class YamlConfig(core.QObject):
"""A config stored on disk as YAML file.
@@ -256,9 +256,9 @@ class YamlConfig(QObject):
"""
VERSION = 2
- changed = pyqtSignal()
+ changed = core.pyqtSignal()
- def __init__(self, parent: QObject = None) -> None:
+ def __init__(self, parent: core.QObject = None) -> None:
super().__init__(parent)
self._filename = os.path.join(standarddir.config(auto=True),
'autoconfig.yml')
@@ -281,7 +281,7 @@ class YamlConfig(QObject):
"""Iterate over configutils.Values items."""
yield from self._values.values()
- @pyqtSlot()
+ @core.pyqtSlot()
def _mark_changed(self) -> None:
"""Mark the YAML config as changed."""
self._dirty = True
@@ -447,14 +447,14 @@ class YamlConfig(QObject):
self._mark_changed()
-class YamlMigrations(QObject):
+class YamlMigrations(core.QObject):
"""Automated migrations for autoconfig.yml."""
- changed = pyqtSignal()
+ changed = core.pyqtSignal()
# Note: settings is Any because it's not validated yet.
- def __init__(self, settings: Any, parent: QObject = None) -> None:
+ def __init__(self, settings: Any, parent: core.QObject = None) -> None:
super().__init__(parent)
self._settings = settings
@@ -1057,5 +1057,5 @@ def init() -> None:
# https://github.com/qutebrowser/qutebrowser/issues/515
path = os.path.join(standarddir.config(auto=True), 'qsettings')
- for fmt in [QSettings.Format.NativeFormat, QSettings.Format.IniFormat]:
- QSettings.setPath(fmt, QSettings.Scope.UserScope, path)
+ for fmt in [core.QSettings.Format.NativeFormat, core.QSettings.Format.IniFormat]:
+ core.QSettings.setPath(fmt, core.QSettings.Scope.UserScope, path)
diff --git a/qutebrowser/config/configinit.py b/qutebrowser/config/configinit.py
index 03453dded..780aea7f4 100644
--- a/qutebrowser/config/configinit.py
+++ b/qutebrowser/config/configinit.py
@@ -23,7 +23,7 @@ import argparse
import os.path
import sys
-from qutebrowser.qt.widgets import QMessageBox
+from qutebrowser.qt import widgets
from qutebrowser.api import config as configapi
from qutebrowser.config import (config, configdata, configfiles, configtypes,
@@ -135,7 +135,7 @@ def late_init(save_manager: savemanager.SaveManager) -> None:
errbox = msgbox.msgbox(parent=None,
title="Error while reading config",
text=_init_errors.to_html(),
- icon=QMessageBox.Icon.Warning,
+ icon=widgets.QMessageBox.Icon.Warning,
plain_text=False)
errbox.exec()
diff --git a/qutebrowser/config/configtypes.py b/qutebrowser/config/configtypes.py
index 1b0955dcf..b6fd4f2d4 100644
--- a/qutebrowser/config/configtypes.py
+++ b/qutebrowser/config/configtypes.py
@@ -55,10 +55,7 @@ from typing import (Any, Callable, Dict as DictType, Iterable, Iterator,
List as ListType, Optional, Pattern, Sequence, Tuple, Union)
import yaml
-from qutebrowser.qt.core import QUrl, Qt
-from qutebrowser.qt.gui import QColor
-from qutebrowser.qt.widgets import QTabWidget, QTabBar
-from qutebrowser.qt.network import QNetworkProxy
+from qutebrowser.qt import widgets, network, gui
from qutebrowser.misc import objects, debugcachestats
from qutebrowser.config import configexc, configutils
@@ -66,6 +63,7 @@ from qutebrowser.utils import (standarddir, utils, qtutils, urlutils, urlmatch,
usertypes, log)
from qutebrowser.keyinput import keyutils
from qutebrowser.browser.network import pac
+from qutebrowser.qt import core
class _SystemProxy:
@@ -1062,9 +1060,9 @@ class ColorSystem(MappingType):
"""The color system to use for color interpolation."""
MAPPING = {
- 'rgb': (QColor.Spec.Rgb, "Interpolate in the RGB color system."),
- 'hsv': (QColor.Spec.Hsv, "Interpolate in the HSV color system."),
- 'hsl': (QColor.Spec.Hsl, "Interpolate in the HSL color system."),
+ 'rgb': (gui.QColor.Spec.Rgb, "Interpolate in the RGB color system."),
+ 'hsv': (gui.QColor.Spec.Hsv, "Interpolate in the HSV color system."),
+ 'hsl': (gui.QColor.Spec.Hsl, "Interpolate in the HSL color system."),
'none': (None, "Don't show a gradient."),
}
@@ -1113,7 +1111,7 @@ class QtColor(BaseType):
except ValueError:
raise configexc.ValidationError(val, "must be a valid color value")
- def to_py(self, value: _StrUnset) -> Union[_UnsetNone, QColor]:
+ def to_py(self, value: _StrUnset) -> Union[_UnsetNone, gui.QColor]:
self._basic_py_validation(value, str)
if isinstance(value, usertypes.Unset):
return value
@@ -1125,11 +1123,11 @@ class QtColor(BaseType):
kind = value[:openparen]
vals = value[openparen+1:-1].split(',')
- converters: DictType[str, Callable[..., QColor]] = {
- 'rgba': QColor.fromRgb,
- 'rgb': QColor.fromRgb,
- 'hsva': QColor.fromHsv,
- 'hsv': QColor.fromHsv,
+ converters: DictType[str, Callable[..., gui.QColor]] = {
+ 'rgba': gui.QColor.fromRgb,
+ 'rgb': gui.QColor.fromRgb,
+ 'hsva': gui.QColor.fromHsv,
+ 'hsv': gui.QColor.fromHsv,
}
conv = converters.get(kind)
@@ -1147,7 +1145,7 @@ class QtColor(BaseType):
for kind, val in zip(kind, vals)]
return conv(*int_vals)
- color = QColor(value)
+ color = gui.QColor(value)
if color.isValid():
return color
else:
@@ -1185,7 +1183,7 @@ class QssColor(BaseType):
# QColor doesn't handle these
return value
- if not QColor.isValidColor(value):
+ if not gui.QColor.isValidColor(value):
raise configexc.ValidationError(value, "must be a valid color")
return value
@@ -1649,7 +1647,7 @@ class Proxy(BaseType):
def to_py(
self,
value: _StrUnset
- ) -> Union[_UnsetNone, QNetworkProxy, _SystemProxy, pac.PACFetcher]:
+ ) -> Union[_UnsetNone, network.QNetworkProxy, _SystemProxy, pac.PACFetcher]:
self._basic_py_validation(value, str)
if isinstance(value, usertypes.Unset):
return value
@@ -1661,13 +1659,13 @@ class Proxy(BaseType):
return SYSTEM_PROXY
if value == 'none':
- url = QUrl('direct://')
+ url = core.QUrl('direct://')
else:
# If we add a special value to valid_values, we need to handle
# it here!
assert self.valid_values is not None
assert value not in self.valid_values, value
- url = QUrl(value)
+ url = core.QUrl(value)
return urlutils.proxy_from_url(url)
except (urlutils.InvalidUrlError, urlutils.InvalidProxyTypeError) as e:
raise configexc.ValidationError(value, e)
@@ -1722,7 +1720,7 @@ class FuzzyUrl(BaseType):
"""A URL which gets interpreted as search if needed."""
- def to_py(self, value: _StrUnset) -> Union[QUrl, _UnsetNone]:
+ def to_py(self, value: _StrUnset) -> Union[core.QUrl, _UnsetNone]:
self._basic_py_validation(value, str)
if isinstance(value, usertypes.Unset):
return value
@@ -1798,10 +1796,10 @@ class Position(MappingType):
"""The position of the tab bar."""
MAPPING = {
- 'top': (QTabWidget.TabPosition.North, None),
- 'bottom': (QTabWidget.TabPosition.South, None),
- 'left': (QTabWidget.TabPosition.West, None),
- 'right': (QTabWidget.TabPosition.East, None),
+ 'top': (widgets.QTabWidget.TabPosition.North, None),
+ 'bottom': (widgets.QTabWidget.TabPosition.South, None),
+ 'left': (widgets.QTabWidget.TabPosition.West, None),
+ 'right': (widgets.QTabWidget.TabPosition.East, None),
}
@@ -1810,9 +1808,9 @@ class TextAlignment(MappingType):
"""Alignment of text."""
MAPPING = {
- 'left': (Qt.AlignmentFlag.AlignLeft, None),
- 'right': (Qt.AlignmentFlag.AlignRight, None),
- 'center': (Qt.AlignmentFlag.AlignCenter, None),
+ 'left': (core.Qt.AlignmentFlag.AlignLeft, None),
+ 'right': (core.Qt.AlignmentFlag.AlignRight, None),
+ 'center': (core.Qt.AlignmentFlag.AlignCenter, None),
}
@@ -1833,14 +1831,14 @@ class Url(BaseType):
"""A URL as a string."""
- def to_py(self, value: _StrUnset) -> Union[_UnsetNone, QUrl]:
+ def to_py(self, value: _StrUnset) -> Union[_UnsetNone, core.QUrl]:
self._basic_py_validation(value, str)
if isinstance(value, usertypes.Unset):
return value
elif not value:
return None
- qurl = QUrl.fromUserInput(value)
+ qurl = core.QUrl.fromUserInput(value)
if not qurl.isValid():
raise configexc.ValidationError(value, "invalid URL - "
"{}".format(qurl.errorString()))
@@ -1868,17 +1866,17 @@ class SelectOnRemove(MappingType):
MAPPING = {
'prev': (
- QTabBar.SelectionBehavior.SelectLeftTab,
+ widgets.QTabBar.SelectionBehavior.SelectLeftTab,
("Select the tab which came before the closed one "
"(left in horizontal, above in vertical)."),
),
'next': (
- QTabBar.SelectionBehavior.SelectRightTab,
+ widgets.QTabBar.SelectionBehavior.SelectRightTab,
("Select the tab which came after the closed one "
"(right in horizontal, below in vertical)."),
),
'last-used': (
- QTabBar.SelectionBehavior.SelectPreviousTab,
+ widgets.QTabBar.SelectionBehavior.SelectPreviousTab,
"Select the previously selected tab.",
),
}
diff --git a/qutebrowser/config/configutils.py b/qutebrowser/config/configutils.py
index c03971077..fb4d748d5 100644
--- a/qutebrowser/config/configutils.py
+++ b/qutebrowser/config/configutils.py
@@ -28,9 +28,7 @@ from typing import (
TYPE_CHECKING, Any, Dict, Iterator, List, Optional, Sequence, Set, Union,
MutableMapping)
-from qutebrowser.qt.core import QUrl
-from qutebrowser.qt.gui import QFontDatabase
-from qutebrowser.qt.widgets import QApplication
+from qutebrowser.qt import widgets, gui, core
from qutebrowser.utils import utils, urlmatch, urlutils, usertypes, qtutils
from qutebrowser.config import configexc
@@ -146,7 +144,7 @@ class Values:
return bool(self._vmap)
def _check_pattern_support(
- self, arg: Union[urlmatch.UrlPattern, QUrl, None]) -> None:
+ self, arg: Union[urlmatch.UrlPattern, core.QUrl, None]) -> None:
"""Make sure patterns are supported if one was given."""
if arg is not None and not self.opt.supports_pattern:
raise configexc.NoPatternError(self.opt.name)
@@ -206,7 +204,7 @@ class Values:
else:
return usertypes.UNSET
- def get_for_url(self, url: QUrl = None, *, fallback: bool = True) -> Any:
+ def get_for_url(self, url: core.QUrl = None, *, fallback: bool = True) -> Any:
"""Get a config value, falling back when needed.
This first tries to find a value matching the URL (if given).
@@ -294,7 +292,7 @@ class FontFamilies:
@classmethod
def from_system_default(
cls,
- font_type: QFontDatabase.SystemFont = QFontDatabase.SystemFont.FixedFont,
+ font_type: gui.QFontDatabase.SystemFont = gui.QFontDatabase.SystemFont.FixedFont,
) -> 'FontFamilies':
"""Get a FontFamilies object for the default system font.
@@ -338,8 +336,8 @@ class FontFamilies:
the "right" choice isn't really obvious. Thus, let's go for the
QFontDatabase approach here, since it's by far the simplest one.
"""
- assert QApplication.instance() is not None
- font = QFontDatabase.systemFont(font_type)
+ assert widgets.QApplication.instance() is not None
+ font = gui.QFontDatabase.systemFont(font_type)
return cls([font.family()])
@classmethod
diff --git a/qutebrowser/config/qtargs.py b/qutebrowser/config/qtargs.py
index 6584daecd..0935c0b11 100644
--- a/qutebrowser/config/qtargs.py
+++ b/qutebrowser/config/qtargs.py
@@ -25,7 +25,7 @@ import argparse
import pathlib
from typing import Any, Dict, Iterator, List, Optional, Sequence, Tuple
-from qutebrowser.qt.core import QLocale
+from qutebrowser.qt import core
from qutebrowser.config import config
from qutebrowser.misc import objects
@@ -254,7 +254,7 @@ def _qtwebengine_args(
lang_override = _get_lang_override(
webengine_version=versions.webengine,
- locale_name=QLocale().bcp47Name(),
+ locale_name=core.QLocale().bcp47Name(),
)
if lang_override is not None:
yield f'--lang={lang_override}'
diff --git a/qutebrowser/config/stylesheet.py b/qutebrowser/config/stylesheet.py
index 8ad873ab5..af33c1525 100644
--- a/qutebrowser/config/stylesheet.py
+++ b/qutebrowser/config/stylesheet.py
@@ -21,16 +21,15 @@
import functools
from typing import Optional, FrozenSet
-
-from qutebrowser.qt.core import pyqtSlot, QObject
-from qutebrowser.qt.widgets import QWidget
+from qutebrowser.qt import widgets
from qutebrowser.config import config
from qutebrowser.misc import debugcachestats
from qutebrowser.utils import jinja, log
+from qutebrowser.qt import core
-def set_register(obj: QWidget,
+def set_register(obj: widgets.QWidget,
stylesheet: str = None, *,
update: bool = True) -> None:
"""Set the stylesheet for an object.
@@ -60,7 +59,7 @@ def init() -> None:
config.instance.changed.connect(_render_stylesheet.cache_clear)
-class _StyleSheetObserver(QObject):
+class _StyleSheetObserver(core.QObject):
"""Set the stylesheet on the given object and update it on changes.
@@ -72,7 +71,7 @@ class _StyleSheetObserver(QObject):
None.
"""
- def __init__(self, obj: QWidget,
+ def __init__(self, obj: widgets.QWidget,
stylesheet: Optional[str], update: bool) -> None:
super().__init__()
self._obj = obj
@@ -100,7 +99,7 @@ class _StyleSheetObserver(QObject):
"""
return _render_stylesheet(self._stylesheet)
- @pyqtSlot(str)
+ @core.pyqtSlot(str)
def _maybe_update_stylesheet(self, option: str) -> None:
"""Update the stylesheet for obj if the option changed affects it."""
assert self._options is not None
diff --git a/qutebrowser/config/websettings.py b/qutebrowser/config/websettings.py
index 7f59367cb..e054254fa 100644
--- a/qutebrowser/config/websettings.py
+++ b/qutebrowser/config/websettings.py
@@ -24,14 +24,13 @@ import argparse
import functools
import dataclasses
from typing import Any, Callable, Dict, Optional, Union
-
-from qutebrowser.qt.core import QUrl, pyqtSlot, qVersion
-from qutebrowser.qt.gui import QFont
+from qutebrowser.qt import gui
import qutebrowser
from qutebrowser.config import config
from qutebrowser.utils import usertypes, urlmatch, qtutils, utils
from qutebrowser.misc import objects, debugcachestats
+from qutebrowser.qt import core
UNSET = object()
@@ -104,7 +103,7 @@ class AbstractSettings:
_ATTRIBUTES: Dict[str, AttributeInfo] = {}
_FONT_SIZES: Dict[str, Any] = {}
_FONT_FAMILIES: Dict[str, Any] = {}
- _FONT_TO_QFONT: Dict[Any, QFont.StyleHint] = {}
+ _FONT_TO_QFONT: Dict[Any, gui.QFont.StyleHint] = {}
def __init__(self, settings: Any) -> None:
self._settings = settings
@@ -152,7 +151,7 @@ class AbstractSettings:
if value is usertypes.UNSET:
self._settings.resetFontFamily(family)
elif value is None:
- font = QFont()
+ font = gui.QFont()
font.setStyleHint(self._FONT_TO_QFONT[family])
value = font.defaultFamily()
self._settings.setFontFamily(family, value)
@@ -184,7 +183,7 @@ class AbstractSettings:
value = config.instance.get(setting)
self._update_setting(setting, value)
- def update_for_url(self, url: QUrl) -> None:
+ def update_for_url(self, url: core.QUrl) -> None:
"""Update settings customized for the given tab."""
qtutils.ensure_valid(url)
for values in config.instance:
@@ -218,14 +217,14 @@ def _format_user_agent(template: str, backend: usertypes.Backend) -> str:
os_info=parsed.os_info,
webkit_version=parsed.webkit_version,
qt_key=parsed.qt_key,
- qt_version=qVersion(),
+ qt_version=core.qVersion(),
upstream_browser_key=parsed.upstream_browser_key,
upstream_browser_version=parsed.upstream_browser_version,
qutebrowser_version=qutebrowser.__version__,
)
-def user_agent(url: QUrl = None) -> str:
+def user_agent(url: core.QUrl = None) -> str:
"""Get the user agent for the given URL, or the global one if URL is None.
Note that the given URL should always be valid.
@@ -266,7 +265,7 @@ def clear_private_data() -> None:
raise utils.Unreachable(objects.backend)
-@pyqtSlot()
+@core.pyqtSlot()
def shutdown() -> None:
"""Shut down QWeb(Engine)Settings."""
if objects.backend == usertypes.Backend.QtWebEngine:
diff --git a/qutebrowser/extensions/interceptors.py b/qutebrowser/extensions/interceptors.py
index ae537492e..1b66c17ce 100644
--- a/qutebrowser/extensions/interceptors.py
+++ b/qutebrowser/extensions/interceptors.py
@@ -23,7 +23,7 @@ import enum
import dataclasses
from typing import Callable, List, Optional
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import core
class ResourceType(enum.Enum):
@@ -67,10 +67,10 @@ class Request:
"""A request which can be intercepted/blocked."""
#: The URL of the page being shown.
- first_party_url: Optional[QUrl]
+ first_party_url: Optional[core.QUrl]
#: The URL of the file being requested.
- request_url: QUrl
+ request_url: core.QUrl
is_blocked: bool = False
@@ -81,7 +81,7 @@ class Request:
"""Block this request."""
self.is_blocked = True
- def redirect(self, url: QUrl, *, ignore_unsupported: bool = False) -> None:
+ def redirect(self, url: core.QUrl, *, ignore_unsupported: bool = False) -> None:
"""Redirect this request.
Only some types of requests can be successfully redirected.
diff --git a/qutebrowser/extensions/loader.py b/qutebrowser/extensions/loader.py
index 073acd44c..8fa7daba7 100644
--- a/qutebrowser/extensions/loader.py
+++ b/qutebrowser/extensions/loader.py
@@ -27,7 +27,7 @@ import argparse
import dataclasses
from typing import Callable, Iterator, List, Optional, Tuple
-from qutebrowser.qt.core import pyqtSlot
+from qutebrowser.qt import core
from qutebrowser import components
from qutebrowser.config import config
@@ -140,7 +140,7 @@ def _load_component(info: ExtensionInfo, *,
return mod
-@pyqtSlot(str)
+@core.pyqtSlot(str)
def _on_config_changed(changed_name: str) -> None:
"""Call config_changed hooks if the config changed."""
for mod_info in _module_infos:
diff --git a/qutebrowser/keyinput/basekeyparser.py b/qutebrowser/keyinput/basekeyparser.py
index cdb3948b4..c2335d9b0 100644
--- a/qutebrowser/keyinput/basekeyparser.py
+++ b/qutebrowser/keyinput/basekeyparser.py
@@ -24,12 +24,10 @@ import types
import dataclasses
from typing import Mapping, MutableMapping, Optional, Sequence
-from qutebrowser.qt.core import QObject, pyqtSignal
-from qutebrowser.qt.gui import QKeySequence, QKeyEvent
-
from qutebrowser.config import config
from qutebrowser.utils import log, usertypes, utils
from qutebrowser.keyinput import keyutils
+from qutebrowser.qt import gui, core
@dataclasses.dataclass(frozen=True)
@@ -37,12 +35,12 @@ class MatchResult:
"""The result of matching a keybinding."""
- match_type: QKeySequence.SequenceMatch
+ match_type: gui.QKeySequence.SequenceMatch
command: Optional[str]
sequence: keyutils.KeySequence
def __post_init__(self) -> None:
- if self.match_type == QKeySequence.SequenceMatch.ExactMatch:
+ if self.match_type == gui.QKeySequence.SequenceMatch.ExactMatch:
assert self.command is not None
else:
assert self.command is None
@@ -89,7 +87,7 @@ class BindingTrie:
node.command = command
def __contains__(self, sequence: keyutils.KeySequence) -> bool:
- return self.matches(sequence).match_type == QKeySequence.SequenceMatch.ExactMatch
+ return self.matches(sequence).match_type == gui.QKeySequence.SequenceMatch.ExactMatch
def __repr__(self) -> str:
return utils.get_repr(self, children=self.children,
@@ -131,25 +129,25 @@ class BindingTrie:
try:
node = node.children[key]
except KeyError:
- return MatchResult(match_type=QKeySequence.SequenceMatch.NoMatch,
+ return MatchResult(match_type=gui.QKeySequence.SequenceMatch.NoMatch,
command=None,
sequence=sequence)
if node.command is not None:
- return MatchResult(match_type=QKeySequence.SequenceMatch.ExactMatch,
+ return MatchResult(match_type=gui.QKeySequence.SequenceMatch.ExactMatch,
command=node.command,
sequence=sequence)
elif node.children:
- return MatchResult(match_type=QKeySequence.SequenceMatch.PartialMatch,
+ return MatchResult(match_type=gui.QKeySequence.SequenceMatch.PartialMatch,
command=None,
sequence=sequence)
else: # This can only happen when there are no bindings at all.
- return MatchResult(match_type=QKeySequence.SequenceMatch.NoMatch,
+ return MatchResult(match_type=gui.QKeySequence.SequenceMatch.NoMatch,
command=None,
sequence=sequence)
-class BaseKeyParser(QObject):
+class BaseKeyParser(core.QObject):
"""Parser for vim-like key sequences and shortcuts.
@@ -176,12 +174,12 @@ class BaseKeyParser(QObject):
arg 2: Ignore the request if we're not in that mode
"""
- keystring_updated = pyqtSignal(str)
- request_leave = pyqtSignal(usertypes.KeyMode, str, bool)
+ keystring_updated = core.pyqtSignal(str)
+ request_leave = core.pyqtSignal(usertypes.KeyMode, str, bool)
def __init__(self, *, mode: usertypes.KeyMode,
win_id: int,
- parent: QObject = None,
+ parent: core.QObject = None,
do_log: bool = True,
passthrough: bool = False,
supports_count: bool = True) -> None:
@@ -247,7 +245,7 @@ class BaseKeyParser(QObject):
self._debug_log("Mapped {} -> {}".format(
sequence, mapped))
return self._match_key(mapped)
- return MatchResult(match_type=QKeySequence.SequenceMatch.NoMatch,
+ return MatchResult(match_type=gui.QKeySequence.SequenceMatch.NoMatch,
command=None,
sequence=sequence)
@@ -268,8 +266,8 @@ class BaseKeyParser(QObject):
return True
return False
- def handle(self, e: QKeyEvent, *,
- dry_run: bool = False) -> QKeySequence.SequenceMatch:
+ def handle(self, e: gui.QKeyEvent, *,
+ dry_run: bool = False) -> gui.QKeySequence.SequenceMatch:
"""Handle a new keypress.
Separate the keypress into count/command, then check if it matches
@@ -290,32 +288,32 @@ class BaseKeyParser(QObject):
# See https://github.com/qutebrowser/qutebrowser/issues/7047
log.keyboard.debug(f"Got invalid key: {ex}")
self.clear_keystring()
- return QKeySequence.SequenceMatch.NoMatch
+ return gui.QKeySequence.SequenceMatch.NoMatch
self._debug_log(f"Got key: {info!r} (dry_run {dry_run})")
if info.is_modifier_key():
self._debug_log("Ignoring, only modifier")
- return QKeySequence.SequenceMatch.NoMatch
+ return gui.QKeySequence.SequenceMatch.NoMatch
try:
sequence = self._sequence.append_event(e)
except keyutils.KeyParseError as ex:
self._debug_log("{} Aborting keychain.".format(ex))
self.clear_keystring()
- return QKeySequence.SequenceMatch.NoMatch
+ return gui.QKeySequence.SequenceMatch.NoMatch
result = self._match_key(sequence)
del sequence # Enforce code below to use the modified result.sequence
- if result.match_type == QKeySequence.SequenceMatch.NoMatch:
+ if result.match_type == gui.QKeySequence.SequenceMatch.NoMatch:
result = self._match_without_modifiers(result.sequence)
- if result.match_type == QKeySequence.SequenceMatch.NoMatch:
+ if result.match_type == gui.QKeySequence.SequenceMatch.NoMatch:
result = self._match_key_mapping(result.sequence)
- if result.match_type == QKeySequence.SequenceMatch.NoMatch:
+ if result.match_type == gui.QKeySequence.SequenceMatch.NoMatch:
was_count = self._match_count(result.sequence, dry_run)
if was_count:
- return QKeySequence.SequenceMatch.ExactMatch
+ return gui.QKeySequence.SequenceMatch.ExactMatch
if dry_run:
return result.match_type
@@ -326,18 +324,18 @@ class BaseKeyParser(QObject):
def _handle_result(self, info: keyutils.KeyInfo, result: MatchResult) -> None:
"""Handle a final MatchResult from handle()."""
- if result.match_type == QKeySequence.SequenceMatch.ExactMatch:
+ if result.match_type == gui.QKeySequence.SequenceMatch.ExactMatch:
assert result.command is not None
self._debug_log("Definitive match for '{}'.".format(
result.sequence))
count = int(self._count) if self._count else None
self.clear_keystring()
self.execute(result.command, count)
- elif result.match_type == QKeySequence.SequenceMatch.PartialMatch:
+ elif result.match_type == gui.QKeySequence.SequenceMatch.PartialMatch:
self._debug_log("No match for '{}' (added {})".format(
result.sequence, info))
self.keystring_updated.emit(self._count + str(result.sequence))
- elif result.match_type == QKeySequence.SequenceMatch.NoMatch:
+ elif result.match_type == gui.QKeySequence.SequenceMatch.NoMatch:
self._debug_log("Giving up with '{}', no matches".format(
result.sequence))
self.clear_keystring()
diff --git a/qutebrowser/keyinput/eventfilter.py b/qutebrowser/keyinput/eventfilter.py
index 31ffcc7f9..903155f61 100644
--- a/qutebrowser/keyinput/eventfilter.py
+++ b/qutebrowser/keyinput/eventfilter.py
@@ -21,15 +21,13 @@
from typing import cast
-from qutebrowser.qt.core import pyqtSlot, QObject, QEvent
-from qutebrowser.qt.gui import QKeyEvent, QWindow
-
from qutebrowser.keyinput import modeman
from qutebrowser.misc import quitter, objects
from qutebrowser.utils import objreg
+from qutebrowser.qt import gui, core
-class EventFilter(QObject):
+class EventFilter(core.QObject):
"""Global Qt event filter.
@@ -39,23 +37,23 @@ class EventFilter(QObject):
event.
"""
- def __init__(self, parent: QObject = None) -> None:
+ def __init__(self, parent: core.QObject = None) -> None:
super().__init__(parent)
self._activated = True
self._handlers = {
- QEvent.Type.KeyPress: self._handle_key_event,
- QEvent.Type.KeyRelease: self._handle_key_event,
- QEvent.Type.ShortcutOverride: self._handle_key_event,
+ core.QEvent.Type.KeyPress: self._handle_key_event,
+ core.QEvent.Type.KeyRelease: self._handle_key_event,
+ core.QEvent.Type.ShortcutOverride: self._handle_key_event,
}
def install(self) -> None:
objects.qapp.installEventFilter(self)
- @pyqtSlot()
+ @core.pyqtSlot()
def shutdown(self) -> None:
objects.qapp.removeEventFilter(self)
- def _handle_key_event(self, event: QKeyEvent) -> bool:
+ def _handle_key_event(self, event: gui.QKeyEvent) -> bool:
"""Handle a key press/release event.
Args:
@@ -76,7 +74,7 @@ class EventFilter(QObject):
# No window available yet, or not a MainWindow
return False
- def eventFilter(self, obj: QObject, event: QEvent) -> bool:
+ def eventFilter(self, obj: core.QObject, event: core.QEvent) -> bool:
"""Handle an event.
Args:
@@ -86,7 +84,7 @@ class EventFilter(QObject):
Return:
True if the event should be filtered, False if it's passed through.
"""
- if not isinstance(obj, QWindow):
+ if not isinstance(obj, gui.QWindow):
# We already handled this same event at some point earlier, so
# we're not interested in it anymore.
return False
@@ -101,7 +99,7 @@ class EventFilter(QObject):
handler = self._handlers[typ]
try:
- return handler(cast(QKeyEvent, event))
+ return handler(cast(gui.QKeyEvent, event))
except:
# If there is an exception in here and we leave the eventfilter
# activated, we'll get an infinite loop and a stack overflow.
diff --git a/qutebrowser/keyinput/keyutils.py b/qutebrowser/keyinput/keyutils.py
index f91936257..70898ceb2 100644
--- a/qutebrowser/keyinput/keyutils.py
+++ b/qutebrowser/keyinput/keyutils.py
@@ -34,11 +34,8 @@ handle what we actually think we do.
import itertools
import dataclasses
from typing import Iterator, List, Mapping, Optional, Union, overload
-
-from qutebrowser.qt.core import Qt, QEvent
-from qutebrowser.qt.gui import QKeySequence, QKeyEvent
try:
- from qutebrowser.qt.core import QKeyCombination
+ from qutebrowser.qt import gui, core
except ImportError:
QKeyCombination = None # Qt 6 only
@@ -56,22 +53,22 @@ class InvalidKeyError(Exception):
# Map Qt::Key values to their Qt::KeyboardModifier value.
_MODIFIER_MAP = {
- Qt.Key.Key_Shift: Qt.KeyboardModifier.ShiftModifier,
- Qt.Key.Key_Control: Qt.KeyboardModifier.ControlModifier,
- Qt.Key.Key_Alt: Qt.KeyboardModifier.AltModifier,
- Qt.Key.Key_Meta: Qt.KeyboardModifier.MetaModifier,
- Qt.Key.Key_AltGr: Qt.KeyboardModifier.GroupSwitchModifier,
- Qt.Key.Key_Mode_switch: Qt.KeyboardModifier.GroupSwitchModifier,
+ core.Qt.Key.Key_Shift: core.Qt.KeyboardModifier.ShiftModifier,
+ core.Qt.Key.Key_Control: core.Qt.KeyboardModifier.ControlModifier,
+ core.Qt.Key.Key_Alt: core.Qt.KeyboardModifier.AltModifier,
+ core.Qt.Key.Key_Meta: core.Qt.KeyboardModifier.MetaModifier,
+ core.Qt.Key.Key_AltGr: core.Qt.KeyboardModifier.GroupSwitchModifier,
+ core.Qt.Key.Key_Mode_switch: core.Qt.KeyboardModifier.GroupSwitchModifier,
}
try:
- _NIL_KEY = Qt.Key(0)
+ _NIL_KEY = core.Qt.Key(0)
except ValueError:
# WORKAROUND for
# https://www.riverbankcomputing.com/pipermail/pyqt/2022-April/044607.html
_NIL_KEY = 0
-_ModifierType = Qt.KeyboardModifier
+_ModifierType = core.Qt.KeyboardModifier
_SPECIAL_NAMES = {
@@ -81,104 +78,104 @@ _SPECIAL_NAMES = {
# For dead/combining keys, we return the corresponding non-combining
# key, as that's easier to add to the config.
- Qt.Key.Key_Super_L: 'Super L',
- Qt.Key.Key_Super_R: 'Super R',
- Qt.Key.Key_Hyper_L: 'Hyper L',
- Qt.Key.Key_Hyper_R: 'Hyper R',
- Qt.Key.Key_Direction_L: 'Direction L',
- Qt.Key.Key_Direction_R: 'Direction R',
-
- Qt.Key.Key_Shift: 'Shift',
- Qt.Key.Key_Control: 'Control',
- Qt.Key.Key_Meta: 'Meta',
- Qt.Key.Key_Alt: 'Alt',
- Qt.Key.Key_AltGr: 'AltGr',
-
- Qt.Key.Key_Multi_key: 'Multi key',
- Qt.Key.Key_SingleCandidate: 'Single Candidate',
- Qt.Key.Key_Mode_switch: 'Mode switch',
-
- Qt.Key.Key_Dead_Grave: '`',
- Qt.Key.Key_Dead_Acute: '´',
- Qt.Key.Key_Dead_Circumflex: '^',
- Qt.Key.Key_Dead_Tilde: '~',
- Qt.Key.Key_Dead_Macron: '¯',
- Qt.Key.Key_Dead_Breve: '˘',
- Qt.Key.Key_Dead_Abovedot: '˙',
- Qt.Key.Key_Dead_Diaeresis: '¨',
- Qt.Key.Key_Dead_Abovering: '˚',
- Qt.Key.Key_Dead_Doubleacute: '˝',
- Qt.Key.Key_Dead_Caron: 'ˇ',
- Qt.Key.Key_Dead_Cedilla: '¸',
- Qt.Key.Key_Dead_Ogonek: '˛',
- Qt.Key.Key_Dead_Iota: 'Iota',
- Qt.Key.Key_Dead_Voiced_Sound: 'Voiced Sound',
- Qt.Key.Key_Dead_Semivoiced_Sound: 'Semivoiced Sound',
- Qt.Key.Key_Dead_Belowdot: 'Belowdot',
- Qt.Key.Key_Dead_Hook: 'Hook',
- Qt.Key.Key_Dead_Horn: 'Horn',
- Qt.Key.Key_Dead_Stroke: '\u0335', # '̵'
- Qt.Key.Key_Dead_Abovecomma: '\u0313', # '̓'
- Qt.Key.Key_Dead_Abovereversedcomma: '\u0314', # '̔'
- Qt.Key.Key_Dead_Doublegrave: '\u030f', # '̏'
- Qt.Key.Key_Dead_Belowring: '\u0325', # '̥'
- Qt.Key.Key_Dead_Belowmacron: '\u0331', # '̱'
- Qt.Key.Key_Dead_Belowcircumflex: '\u032d', # '̭'
- Qt.Key.Key_Dead_Belowtilde: '\u0330', # '̰'
- Qt.Key.Key_Dead_Belowbreve: '\u032e', # '̮'
- Qt.Key.Key_Dead_Belowdiaeresis: '\u0324', # '̤'
- Qt.Key.Key_Dead_Invertedbreve: '\u0311', # '̑'
- Qt.Key.Key_Dead_Belowcomma: '\u0326', # '̦'
- Qt.Key.Key_Dead_Currency: '¤',
- Qt.Key.Key_Dead_a: 'a',
- Qt.Key.Key_Dead_A: 'A',
- Qt.Key.Key_Dead_e: 'e',
- Qt.Key.Key_Dead_E: 'E',
- Qt.Key.Key_Dead_i: 'i',
- Qt.Key.Key_Dead_I: 'I',
- Qt.Key.Key_Dead_o: 'o',
- Qt.Key.Key_Dead_O: 'O',
- Qt.Key.Key_Dead_u: 'u',
- Qt.Key.Key_Dead_U: 'U',
- Qt.Key.Key_Dead_Small_Schwa: 'ə',
- Qt.Key.Key_Dead_Capital_Schwa: 'Ə',
- Qt.Key.Key_Dead_Greek: 'Greek',
- Qt.Key.Key_Dead_Lowline: '\u0332', # '̲'
- Qt.Key.Key_Dead_Aboveverticalline: '\u030d', # '̍'
- Qt.Key.Key_Dead_Belowverticalline: '\u0329',
- Qt.Key.Key_Dead_Longsolidusoverlay: '\u0338', # '̸'
-
- Qt.Key.Key_MediaLast: 'Media Last',
-
- Qt.Key.Key_unknown: 'Unknown',
+ core.Qt.Key.Key_Super_L: 'Super L',
+ core.Qt.Key.Key_Super_R: 'Super R',
+ core.Qt.Key.Key_Hyper_L: 'Hyper L',
+ core.Qt.Key.Key_Hyper_R: 'Hyper R',
+ core.Qt.Key.Key_Direction_L: 'Direction L',
+ core.Qt.Key.Key_Direction_R: 'Direction R',
+
+ core.Qt.Key.Key_Shift: 'Shift',
+ core.Qt.Key.Key_Control: 'Control',
+ core.Qt.Key.Key_Meta: 'Meta',
+ core.Qt.Key.Key_Alt: 'Alt',
+ core.Qt.Key.Key_AltGr: 'AltGr',
+
+ core.Qt.Key.Key_Multi_key: 'Multi key',
+ core.Qt.Key.Key_SingleCandidate: 'Single Candidate',
+ core.Qt.Key.Key_Mode_switch: 'Mode switch',
+
+ core.Qt.Key.Key_Dead_Grave: '`',
+ core.Qt.Key.Key_Dead_Acute: '´',
+ core.Qt.Key.Key_Dead_Circumflex: '^',
+ core.Qt.Key.Key_Dead_Tilde: '~',
+ core.Qt.Key.Key_Dead_Macron: '¯',
+ core.Qt.Key.Key_Dead_Breve: '˘',
+ core.Qt.Key.Key_Dead_Abovedot: '˙',
+ core.Qt.Key.Key_Dead_Diaeresis: '¨',
+ core.Qt.Key.Key_Dead_Abovering: '˚',
+ core.Qt.Key.Key_Dead_Doubleacute: '˝',
+ core.Qt.Key.Key_Dead_Caron: 'ˇ',
+ core.Qt.Key.Key_Dead_Cedilla: '¸',
+ core.Qt.Key.Key_Dead_Ogonek: '˛',
+ core.Qt.Key.Key_Dead_Iota: 'Iota',
+ core.Qt.Key.Key_Dead_Voiced_Sound: 'Voiced Sound',
+ core.Qt.Key.Key_Dead_Semivoiced_Sound: 'Semivoiced Sound',
+ core.Qt.Key.Key_Dead_Belowdot: 'Belowdot',
+ core.Qt.Key.Key_Dead_Hook: 'Hook',
+ core.Qt.Key.Key_Dead_Horn: 'Horn',
+ core.Qt.Key.Key_Dead_Stroke: '\u0335', # '̵'
+ core.Qt.Key.Key_Dead_Abovecomma: '\u0313', # '̓'
+ core.Qt.Key.Key_Dead_Abovereversedcomma: '\u0314', # '̔'
+ core.Qt.Key.Key_Dead_Doublegrave: '\u030f', # '̏'
+ core.Qt.Key.Key_Dead_Belowring: '\u0325', # '̥'
+ core.Qt.Key.Key_Dead_Belowmacron: '\u0331', # '̱'
+ core.Qt.Key.Key_Dead_Belowcircumflex: '\u032d', # '̭'
+ core.Qt.Key.Key_Dead_Belowtilde: '\u0330', # '̰'
+ core.Qt.Key.Key_Dead_Belowbreve: '\u032e', # '̮'
+ core.Qt.Key.Key_Dead_Belowdiaeresis: '\u0324', # '̤'
+ core.Qt.Key.Key_Dead_Invertedbreve: '\u0311', # '̑'
+ core.Qt.Key.Key_Dead_Belowcomma: '\u0326', # '̦'
+ core.Qt.Key.Key_Dead_Currency: '¤',
+ core.Qt.Key.Key_Dead_a: 'a',
+ core.Qt.Key.Key_Dead_A: 'A',
+ core.Qt.Key.Key_Dead_e: 'e',
+ core.Qt.Key.Key_Dead_E: 'E',
+ core.Qt.Key.Key_Dead_i: 'i',
+ core.Qt.Key.Key_Dead_I: 'I',
+ core.Qt.Key.Key_Dead_o: 'o',
+ core.Qt.Key.Key_Dead_O: 'O',
+ core.Qt.Key.Key_Dead_u: 'u',
+ core.Qt.Key.Key_Dead_U: 'U',
+ core.Qt.Key.Key_Dead_Small_Schwa: 'ə',
+ core.Qt.Key.Key_Dead_Capital_Schwa: 'Ə',
+ core.Qt.Key.Key_Dead_Greek: 'Greek',
+ core.Qt.Key.Key_Dead_Lowline: '\u0332', # '̲'
+ core.Qt.Key.Key_Dead_Aboveverticalline: '\u030d', # '̍'
+ core.Qt.Key.Key_Dead_Belowverticalline: '\u0329',
+ core.Qt.Key.Key_Dead_Longsolidusoverlay: '\u0338', # '̸'
+
+ core.Qt.Key.Key_MediaLast: 'Media Last',
+
+ core.Qt.Key.Key_unknown: 'Unknown',
# For some keys, we just want a different name
- Qt.Key.Key_Escape: 'Escape',
+ core.Qt.Key.Key_Escape: 'Escape',
_NIL_KEY: 'nil',
}
-def _assert_plain_key(key: Qt.Key) -> None:
+def _assert_plain_key(key: core.Qt.Key) -> None:
"""Make sure this is a key without KeyboardModifier mixed in."""
key_int = qtutils.extract_enum_val(key)
- mask = qtutils.extract_enum_val(Qt.KeyboardModifier.KeyboardModifierMask)
+ mask = qtutils.extract_enum_val(core.Qt.KeyboardModifier.KeyboardModifierMask)
assert not key_int & mask, hex(key_int)
def _assert_plain_modifier(key: _ModifierType) -> None:
"""Make sure this is a modifier without a key mixed in."""
key_int = qtutils.extract_enum_val(key)
- mask = qtutils.extract_enum_val(Qt.KeyboardModifier.KeyboardModifierMask)
+ mask = qtutils.extract_enum_val(core.Qt.KeyboardModifier.KeyboardModifierMask)
assert not key_int & ~mask, hex(key_int)
-def _is_printable(key: Qt.Key) -> bool:
+def _is_printable(key: core.Qt.Key) -> bool:
_assert_plain_key(key)
- return key <= 0xff and key not in [Qt.Key.Key_Space, _NIL_KEY]
+ return key <= 0xff and key not in [core.Qt.Key.Key_Space, _NIL_KEY]
-def _is_surrogate(key: Qt.Key) -> bool:
+def _is_surrogate(key: core.Qt.Key) -> bool:
"""Check if a codepoint is a UTF-16 surrogate.
UTF-16 surrogates are a reserved range of Unicode from 0xd800
@@ -189,7 +186,7 @@ def _is_surrogate(key: Qt.Key) -> bool:
return 0xd800 <= key <= 0xdfff
-def _remap_unicode(key: Qt.Key, text: str) -> Qt.Key:
+def _remap_unicode(key: core.Qt.Key, text: str) -> core.Qt.Key:
"""Work around QtKeyEvent's bad values for high codepoints.
QKeyEvent handles higher unicode codepoints poorly. It uses UTF-16 to
@@ -207,11 +204,11 @@ def _remap_unicode(key: Qt.Key, text: str) -> Qt.Key:
if len(text) != 1:
raise KeyParseError(text, "Expected 1 character for surrogate, "
"but got {}!".format(len(text)))
- return Qt.Key(ord(text[0]))
+ return core.Qt.Key(ord(text[0]))
return key
-def _check_valid_utf8(s: str, data: Union[Qt.Key, _ModifierType]) -> None:
+def _check_valid_utf8(s: str, data: Union[core.Qt.Key, _ModifierType]) -> None:
"""Make sure the given string is valid UTF-8.
Makes sure there are no chars where Qt did fall back to weird UTF-16
@@ -224,7 +221,7 @@ def _check_valid_utf8(s: str, data: Union[Qt.Key, _ModifierType]) -> None:
.format(int(data), s, e))
-def _key_to_string(key: Qt.Key) -> str:
+def _key_to_string(key: core.Qt.Key) -> str:
"""Convert a Qt::Key member to a meaningful name.
Args:
@@ -238,7 +235,7 @@ def _key_to_string(key: Qt.Key) -> str:
if key in _SPECIAL_NAMES:
return _SPECIAL_NAMES[key]
- result = QKeySequence(key).toString()
+ result = gui.QKeySequence(key).toString()
_check_valid_utf8(result, key)
return result
@@ -250,14 +247,14 @@ def _modifiers_to_string(modifiers: _ModifierType) -> str:
modifier.
"""
_assert_plain_modifier(modifiers)
- altgr = Qt.KeyboardModifier.GroupSwitchModifier
+ altgr = core.Qt.KeyboardModifier.GroupSwitchModifier
if modifiers & altgr:
modifiers &= ~altgr
result = 'AltGr+'
else:
result = ''
- result += QKeySequence(qtutils.extract_enum_val(modifiers)).toString()
+ result += gui.QKeySequence(qtutils.extract_enum_val(modifiers)).toString()
_check_valid_utf8(result, modifiers)
return result
@@ -343,8 +340,8 @@ class KeyInfo:
modifiers: A Qt::KeyboardModifier enum value.
"""
- key: Qt.Key
- modifiers: _ModifierType = Qt.KeyboardModifier.NoModifier
+ key: core.Qt.Key
+ modifiers: _ModifierType = core.Qt.KeyboardModifier.NoModifier
def __post_init__(self) -> None:
"""Run some validation on the key/modifier values."""
@@ -359,20 +356,20 @@ class KeyInfo:
def __repr__(self) -> str:
return utils.get_repr(
self,
- key=debug.qenum_key(Qt, self.key, klass=Qt.Key),
- modifiers=debug.qflags_key(Qt, self.modifiers, klass=Qt.KeyboardModifier),
+ key=debug.qenum_key(core.Qt, self.key, klass=core.Qt.Key),
+ modifiers=debug.qflags_key(core.Qt, self.modifiers, klass=core.Qt.KeyboardModifier),
text=str(self),
)
@classmethod
- def from_event(cls, e: QKeyEvent) -> 'KeyInfo':
+ def from_event(cls, e: gui.QKeyEvent) -> 'KeyInfo':
"""Get a KeyInfo object from a QKeyEvent.
This makes sure that key/modifiers are never mixed and also remaps
UTF-16 surrogates to work around QTBUG-72776.
"""
try:
- key = Qt.Key(e.key())
+ key = core.Qt.Key(e.key())
except ValueError as ex:
raise InvalidKeyError(str(ex))
key = _remap_unicode(key, e.text())
@@ -380,17 +377,17 @@ class KeyInfo:
return cls(key, modifiers)
@classmethod
- def from_qt(cls, combination: Union[int, QKeyCombination]) -> 'KeyInfo':
+ def from_qt(cls, combination: Union[int, core.QKeyCombination]) -> 'KeyInfo':
"""Construct a KeyInfo from a Qt5-style int or Qt6-style QKeyCombination."""
if isinstance(combination, int):
- key = Qt.Key(
- int(combination) & ~Qt.KeyboardModifier.KeyboardModifierMask)
- modifiers = Qt.KeyboardModifier(
- int(combination) & Qt.KeyboardModifier.KeyboardModifierMask)
+ key = core.Qt.Key(
+ int(combination) & ~core.Qt.KeyboardModifier.KeyboardModifierMask)
+ modifiers = core.Qt.KeyboardModifier(
+ int(combination) & core.Qt.KeyboardModifier.KeyboardModifierMask)
return cls(key, modifiers)
else:
# QKeyCombination is now guaranteed to be available here
- assert isinstance(combination, QKeyCombination)
+ assert isinstance(combination, core.QKeyCombination)
try:
key = combination.key()
except ValueError as e:
@@ -419,17 +416,17 @@ class KeyInfo:
.format(self.key))
assert len(key_string) == 1, key_string
- if self.modifiers == Qt.KeyboardModifier.ShiftModifier:
+ if self.modifiers == core.Qt.KeyboardModifier.ShiftModifier:
assert not self.is_special()
return key_string.upper()
- elif self.modifiers == Qt.KeyboardModifier.NoModifier:
+ elif self.modifiers == core.Qt.KeyboardModifier.NoModifier:
assert not self.is_special()
return key_string.lower()
else:
# Use special binding syntax, but <Ctrl-a> instead of <Ctrl-A>
key_string = key_string.lower()
- modifiers = Qt.KeyboardModifier(modifiers)
+ modifiers = core.Qt.KeyboardModifier(modifiers)
# "special" binding
assert self.is_special()
@@ -439,12 +436,12 @@ class KeyInfo:
def text(self) -> str:
"""Get the text which would be displayed when pressing this key."""
control = {
- Qt.Key.Key_Space: ' ',
- Qt.Key.Key_Tab: '\t',
- Qt.Key.Key_Backspace: '\b',
- Qt.Key.Key_Return: '\r',
- Qt.Key.Key_Enter: '\r',
- Qt.Key.Key_Escape: '\x1b',
+ core.Qt.Key.Key_Space: ' ',
+ core.Qt.Key.Key_Tab: '\t',
+ core.Qt.Key.Key_Backspace: '\b',
+ core.Qt.Key.Key_Return: '\r',
+ core.Qt.Key.Key_Enter: '\r',
+ core.Qt.Key.Key_Escape: '\x1b',
}
if self.key in control:
@@ -452,33 +449,33 @@ class KeyInfo:
elif not _is_printable(self.key):
return ''
- text = QKeySequence(self.key).toString()
- if not self.modifiers & Qt.KeyboardModifier.ShiftModifier:
+ text = gui.QKeySequence(self.key).toString()
+ if not self.modifiers & core.Qt.KeyboardModifier.ShiftModifier:
text = text.lower()
return text
- def to_event(self, typ: QEvent.Type = QEvent.Type.KeyPress) -> QKeyEvent:
+ def to_event(self, typ: core.QEvent.Type = core.QEvent.Type.KeyPress) -> gui.QKeyEvent:
"""Get a QKeyEvent from this KeyInfo."""
- return QKeyEvent(typ, self.key, self.modifiers, self.text())
+ return gui.QKeyEvent(typ, self.key, self.modifiers, self.text())
- def to_qt(self) -> Union[int, QKeyCombination]:
+ def to_qt(self) -> Union[int, core.QKeyCombination]:
"""Get something suitable for a QKeySequence."""
- if QKeyCombination is None:
+ if core.QKeyCombination is None:
# Qt 5
return int(self.key) | int(self.modifiers)
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)
+ key = core.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 core.QKeyCombination(self.modifiers, key)
- def with_stripped_modifiers(self, modifiers: Qt.KeyboardModifier) -> "KeyInfo":
+ def with_stripped_modifiers(self, modifiers: core.Qt.KeyboardModifier) -> "KeyInfo":
return KeyInfo(key=self.key, modifiers=self.modifiers & ~modifiers)
def is_special(self) -> bool:
@@ -486,8 +483,8 @@ class KeyInfo:
return not (
_is_printable(self.key) and
self.modifiers in [
- Qt.KeyboardModifier.ShiftModifier,
- Qt.KeyboardModifier.NoModifier,
+ core.Qt.KeyboardModifier.ShiftModifier,
+ core.Qt.KeyboardModifier.NoModifier,
]
)
@@ -520,14 +517,14 @@ class KeySequence:
_MAX_LEN = 4
def __init__(self, *keys: KeyInfo) -> None:
- self._sequences: List[QKeySequence] = []
+ self._sequences: List[gui.QKeySequence] = []
for sub in utils.chunk(keys, self._MAX_LEN):
try:
args = [info.to_qt() for info in sub]
except InvalidKeyError as e:
raise KeyParseError(keystr=None, error=f"Got invalid key: {e}")
- sequence = QKeySequence(*args)
+ sequence = gui.QKeySequence(*args)
self._sequences.append(sequence)
if keys:
assert self
@@ -596,7 +593,7 @@ class KeySequence:
def _validate(self, keystr: str = None) -> None:
try:
for info in self:
- if info.key < Qt.Key.Key_Space or info.key >= Qt.Key.Key_unknown:
+ if info.key < core.Qt.Key.Key_Space or info.key >= core.Qt.Key.Key_unknown:
raise KeyParseError(keystr, "Got invalid key!")
except InvalidKeyError as e:
raise KeyParseError(keystr, f"Got invalid key: {e}")
@@ -605,7 +602,7 @@ class KeySequence:
if not seq:
raise KeyParseError(keystr, "Got invalid key!")
- def matches(self, other: 'KeySequence') -> QKeySequence.SequenceMatch:
+ def matches(self, other: 'KeySequence') -> gui.QKeySequence.SequenceMatch:
"""Check whether the given KeySequence matches with this one.
We store multiple QKeySequences with <= 4 keys each, so we need to
@@ -617,12 +614,12 @@ class KeySequence:
if len(self._sequences) > len(other._sequences):
# If we entered more sequences than there are in the config,
# there's no way there can be a match.
- return QKeySequence.SequenceMatch.NoMatch
+ return gui.QKeySequence.SequenceMatch.NoMatch
for entered, configured in zip(self._sequences, other._sequences):
# If we get NoMatch/PartialMatch in a sequence, we can abort there.
match = entered.matches(configured)
- if match != QKeySequence.SequenceMatch.ExactMatch:
+ if match != gui.QKeySequence.SequenceMatch.ExactMatch:
return match
# We checked all common sequences and they had an ExactMatch.
@@ -634,16 +631,16 @@ class KeySequence:
# If there's the same amount of sequences configured and entered,
# that's an EqualMatch.
if len(self._sequences) == len(other._sequences):
- return QKeySequence.SequenceMatch.ExactMatch
+ return gui.QKeySequence.SequenceMatch.ExactMatch
elif len(self._sequences) < len(other._sequences):
- return QKeySequence.SequenceMatch.PartialMatch
+ return gui.QKeySequence.SequenceMatch.PartialMatch
else:
raise utils.Unreachable("self={!r} other={!r}".format(self, other))
- def append_event(self, ev: QKeyEvent) -> 'KeySequence':
+ def append_event(self, ev: gui.QKeyEvent) -> 'KeySequence':
"""Create a new KeySequence object with the given QKeyEvent added."""
try:
- key = Qt.Key(ev.key())
+ key = core.Qt.Key(ev.key())
except ValueError as e:
raise KeyParseError(None, f"Got invalid key: {e}")
@@ -658,12 +655,12 @@ class KeySequence:
# We always remove Qt.KeyboardModifier.GroupSwitchModifier because QKeySequence has no
# way to mention that in a binding anyways...
- modifiers &= ~Qt.KeyboardModifier.GroupSwitchModifier
+ modifiers &= ~core.Qt.KeyboardModifier.GroupSwitchModifier
# We change Qt.Key.Key_Backtab to Key_Tab here because nobody would
# configure "Shift-Backtab" in their config.
- if modifiers & Qt.KeyboardModifier.ShiftModifier and key == Qt.Key.Key_Backtab:
- key = Qt.Key.Key_Tab
+ if modifiers & core.Qt.KeyboardModifier.ShiftModifier and key == core.Qt.Key.Key_Backtab:
+ key = core.Qt.Key.Key_Tab
# We don't care about a shift modifier with symbols (Shift-: should
# match a : binding even though we typed it with a shift on an
@@ -675,10 +672,10 @@ class KeySequence:
#
# In addition, Shift also *is* relevant when other modifiers are
# involved. Shift-Ctrl-X should not be equivalent to Ctrl-X.
- if (modifiers == Qt.KeyboardModifier.ShiftModifier and
+ if (modifiers == core.Qt.KeyboardModifier.ShiftModifier and
_is_printable(key) and
not ev.text().isupper()):
- modifiers = Qt.KeyboardModifier.NoModifier
+ modifiers = core.Qt.KeyboardModifier.NoModifier
# On macOS, swap Ctrl and Meta back
#
@@ -687,14 +684,14 @@ class KeySequence:
# (or "Cmd") in a key binding name to actually represent what's on the
# keyboard.
if utils.is_mac:
- if modifiers & Qt.KeyboardModifier.ControlModifier and modifiers & Qt.KeyboardModifier.MetaModifier:
+ if modifiers & core.Qt.KeyboardModifier.ControlModifier and modifiers & core.Qt.KeyboardModifier.MetaModifier:
pass
- elif modifiers & Qt.KeyboardModifier.ControlModifier:
- modifiers &= ~Qt.KeyboardModifier.ControlModifier
- modifiers |= Qt.KeyboardModifier.MetaModifier
- elif modifiers & Qt.KeyboardModifier.MetaModifier:
- modifiers &= ~Qt.KeyboardModifier.MetaModifier
- modifiers |= Qt.KeyboardModifier.ControlModifier
+ elif modifiers & core.Qt.KeyboardModifier.ControlModifier:
+ modifiers &= ~core.Qt.KeyboardModifier.ControlModifier
+ modifiers |= core.Qt.KeyboardModifier.MetaModifier
+ elif modifiers & core.Qt.KeyboardModifier.MetaModifier:
+ modifiers &= ~core.Qt.KeyboardModifier.MetaModifier
+ modifiers |= core.Qt.KeyboardModifier.ControlModifier
infos = list(self)
infos.append(KeyInfo(key, modifiers))
@@ -703,7 +700,7 @@ class KeySequence:
def strip_modifiers(self) -> 'KeySequence':
"""Strip optional modifiers from keys."""
- modifiers = Qt.KeyboardModifier.KeypadModifier
+ modifiers = core.Qt.KeyboardModifier.KeypadModifier
infos = [info.with_stripped_modifiers(modifiers) for info in self]
return self.__class__(*infos)
@@ -727,7 +724,7 @@ class KeySequence:
new = cls()
strings = list(_parse_keystring(keystr))
for sub in utils.chunk(strings, cls._MAX_LEN):
- sequence = QKeySequence(', '.join(sub))
+ sequence = gui.QKeySequence(', '.join(sub))
new._sequences.append(sequence)
if keystr:
diff --git a/qutebrowser/keyinput/modeman.py b/qutebrowser/keyinput/modeman.py
index 671c2519e..86082ee87 100644
--- a/qutebrowser/keyinput/modeman.py
+++ b/qutebrowser/keyinput/modeman.py
@@ -23,9 +23,6 @@ import functools
import dataclasses
from typing import Mapping, Callable, MutableMapping, Union, Set, cast
-from qutebrowser.qt.core import pyqtSlot, pyqtSignal, Qt, QObject, QEvent
-from qutebrowser.qt.gui import QKeyEvent, QKeySequence
-
from qutebrowser.commands import runners
from qutebrowser.keyinput import modeparsers, basekeyparser
from qutebrowser.config import config
@@ -33,6 +30,7 @@ from qutebrowser.api import cmdutils
from qutebrowser.utils import usertypes, log, objreg, utils
from qutebrowser.browser import hints
from qutebrowser.misc import objects
+from qutebrowser.qt import gui, core
INPUT_MODES = [usertypes.KeyMode.insert, usertypes.KeyMode.passthrough]
PROMPT_MODES = [usertypes.KeyMode.prompt, usertypes.KeyMode.yesno]
@@ -61,7 +59,7 @@ class KeyEvent:
text: str
@classmethod
- def from_event(cls, event: QKeyEvent) -> 'KeyEvent':
+ def from_event(cls, event: gui.QKeyEvent) -> 'KeyEvent':
"""Initialize a KeyEvent from a QKeyEvent."""
return cls(event.key(), event.text())
@@ -79,7 +77,7 @@ class UnavailableError(Exception):
"""
-def init(win_id: int, parent: QObject) -> 'ModeManager':
+def init(win_id: int, parent: core.QObject) -> 'ModeManager':
"""Initialize the mode manager and the keyparsers for the given win_id."""
commandrunner = runners.CommandRunner(win_id)
@@ -227,7 +225,7 @@ def leave(win_id: int,
instance(win_id).leave(mode, reason, maybe=maybe)
-class ModeManager(QObject):
+class ModeManager(core.QObject):
"""Manager for keyboard modes.
@@ -256,11 +254,11 @@ class ModeManager(QObject):
arg 2: The new key string.
"""
- entered = pyqtSignal(usertypes.KeyMode, int)
- left = pyqtSignal(usertypes.KeyMode, usertypes.KeyMode, int)
- keystring_updated = pyqtSignal(usertypes.KeyMode, str)
+ entered = core.pyqtSignal(usertypes.KeyMode, int)
+ left = core.pyqtSignal(usertypes.KeyMode, usertypes.KeyMode, int)
+ keystring_updated = core.pyqtSignal(usertypes.KeyMode, str)
- def __init__(self, win_id: int, parent: QObject = None) -> None:
+ def __init__(self, win_id: int, parent: core.QObject = None) -> None:
super().__init__(parent)
self._win_id = win_id
self.parsers: ParserDictType = {}
@@ -273,7 +271,7 @@ class ModeManager(QObject):
def __repr__(self) -> str:
return utils.get_repr(self, mode=self.mode)
- def _handle_keypress(self, event: QKeyEvent, *,
+ def _handle_keypress(self, event: gui.QKeyEvent, *,
dry_run: bool = False) -> bool:
"""Handle filtering of KeyPress events.
@@ -292,14 +290,14 @@ class ModeManager(QObject):
match = parser.handle(event, dry_run=dry_run)
has_modifier = event.modifiers() not in [
- Qt.KeyboardModifier.NoModifier,
- Qt.KeyboardModifier.ShiftModifier,
+ core.Qt.KeyboardModifier.NoModifier,
+ core.Qt.KeyboardModifier.ShiftModifier,
] # type: ignore[comparison-overlap]
is_non_alnum = has_modifier or not event.text().strip()
forward_unbound_keys = config.cache['input.forward_unbound_keys']
- if match != QKeySequence.SequenceMatch.NoMatch:
+ if match != gui.QKeySequence.SequenceMatch.NoMatch:
filter_this = True
elif (parser.passthrough or forward_unbound_keys == 'all' or
(forward_unbound_keys == 'auto' and is_non_alnum)):
@@ -320,7 +318,7 @@ class ModeManager(QObject):
filter_this, focus_widget))
return filter_this
- def _handle_keyrelease(self, event: QKeyEvent) -> bool:
+ def _handle_keyrelease(self, event: gui.QKeyEvent) -> bool:
"""Handle filtering of KeyRelease events.
Args:
@@ -411,7 +409,7 @@ class ModeManager(QObject):
self.enter(m, 'command')
- @pyqtSlot(usertypes.KeyMode, str, bool)
+ @core.pyqtSlot(usertypes.KeyMode, str, bool)
def leave(self, mode: usertypes.KeyMode,
reason: str = None,
maybe: bool = False) -> None:
@@ -450,7 +448,7 @@ class ModeManager(QObject):
raise ValueError("Can't leave normal mode!")
self.leave(self.mode, 'leave current')
- def handle_event(self, event: QEvent) -> bool:
+ def handle_event(self, event: core.QEvent) -> bool:
"""Filter all events based on the currently set mode.
Also calls the real keypress handler.
@@ -461,14 +459,14 @@ class ModeManager(QObject):
Return:
True if event should be filtered, False otherwise.
"""
- handlers: Mapping[QEvent.Type, Callable[[QKeyEvent], bool]] = {
- QEvent.Type.KeyPress: self._handle_keypress,
- QEvent.Type.KeyRelease: self._handle_keyrelease,
- QEvent.Type.ShortcutOverride:
+ handlers: Mapping[core.QEvent.Type, Callable[[gui.QKeyEvent], bool]] = {
+ core.QEvent.Type.KeyPress: self._handle_keypress,
+ core.QEvent.Type.KeyRelease: self._handle_keyrelease,
+ core.QEvent.Type.ShortcutOverride:
functools.partial(self._handle_keypress, dry_run=True),
}
handler = handlers[event.type()]
- return handler(cast(QKeyEvent, event))
+ return handler(cast(gui.QKeyEvent, event))
@cmdutils.register(instance='mode-manager', scope='window')
def clear_keychain(self) -> None:
diff --git a/qutebrowser/keyinput/modeparsers.py b/qutebrowser/keyinput/modeparsers.py
index d127a795a..168b88fc8 100644
--- a/qutebrowser/keyinput/modeparsers.py
+++ b/qutebrowser/keyinput/modeparsers.py
@@ -27,14 +27,13 @@ import traceback
import enum
from typing import TYPE_CHECKING, Sequence
-from qutebrowser.qt.core import pyqtSlot, Qt, QObject
-from qutebrowser.qt.gui import QKeySequence, QKeyEvent
-
from qutebrowser.browser import hints
from qutebrowser.commands import cmdexc
from qutebrowser.config import config
from qutebrowser.keyinput import basekeyparser, keyutils, macros
from qutebrowser.utils import usertypes, log, message, objreg, utils
+from qutebrowser.qt import gui, core
+
if TYPE_CHECKING:
from qutebrowser.commands import runners
@@ -62,7 +61,7 @@ class CommandKeyParser(basekeyparser.BaseKeyParser):
def __init__(self, *, mode: usertypes.KeyMode,
win_id: int,
commandrunner: 'runners.CommandRunner',
- parent: QObject = None,
+ parent: core.QObject = None,
do_log: bool = True,
passthrough: bool = False,
supports_count: bool = True) -> None:
@@ -90,7 +89,7 @@ class NormalKeyParser(CommandKeyParser):
def __init__(self, *, win_id: int,
commandrunner: 'runners.CommandRunner',
- parent: QObject = None) -> None:
+ parent: core.QObject = None) -> None:
super().__init__(mode=usertypes.KeyMode.normal, win_id=win_id,
commandrunner=commandrunner, parent=parent)
self._partial_timer = usertypes.Timer(self, 'partial-match')
@@ -103,18 +102,18 @@ class NormalKeyParser(CommandKeyParser):
def __repr__(self) -> str:
return utils.get_repr(self)
- def handle(self, e: QKeyEvent, *,
- dry_run: bool = False) -> QKeySequence.SequenceMatch:
+ def handle(self, e: gui.QKeyEvent, *,
+ dry_run: bool = False) -> gui.QKeySequence.SequenceMatch:
"""Override to abort if the key is a startchar."""
txt = e.text().strip()
if self._inhibited:
self._debug_log("Ignoring key '{}', because the normal mode is "
"currently inhibited.".format(txt))
- return QKeySequence.SequenceMatch.NoMatch
+ return gui.QKeySequence.SequenceMatch.NoMatch
match = super().handle(e, dry_run=dry_run)
- if match == QKeySequence.SequenceMatch.PartialMatch and not dry_run:
+ if match == gui.QKeySequence.SequenceMatch.PartialMatch and not dry_run:
timeout = config.val.input.partial_timeout
if timeout != 0:
self._partial_timer.setInterval(timeout)
@@ -131,7 +130,7 @@ class NormalKeyParser(CommandKeyParser):
self._inhibited_timer.timeout.connect(self._clear_inhibited)
self._inhibited_timer.start()
- @pyqtSlot()
+ @core.pyqtSlot()
def _clear_partial_match(self) -> None:
"""Clear a partial keystring after a timeout."""
self._debug_log("Clearing partial keystring {}".format(
@@ -139,7 +138,7 @@ class NormalKeyParser(CommandKeyParser):
self._sequence = keyutils.KeySequence()
self.keystring_updated.emit(str(self._sequence))
- @pyqtSlot()
+ @core.pyqtSlot()
def _clear_inhibited(self) -> None:
"""Reset inhibition state after a timeout."""
self._debug_log("Releasing inhibition state of normal mode.")
@@ -161,7 +160,7 @@ class HintKeyParser(basekeyparser.BaseKeyParser):
def __init__(self, *, win_id: int,
commandrunner: 'runners.CommandRunner',
hintmanager: hints.HintManager,
- parent: QObject = None) -> None:
+ parent: core.QObject = None) -> None:
super().__init__(mode=usertypes.KeyMode.hint, win_id=win_id,
parent=parent, supports_count=False)
self._command_parser = CommandKeyParser(mode=usertypes.KeyMode.hint,
@@ -174,11 +173,11 @@ class HintKeyParser(basekeyparser.BaseKeyParser):
self._last_press = LastPress.none
self.keystring_updated.connect(self._hintmanager.handle_partial_key)
- def _handle_filter_key(self, e: QKeyEvent) -> QKeySequence.SequenceMatch:
+ def _handle_filter_key(self, e: gui.QKeyEvent) -> gui.QKeySequence.SequenceMatch:
"""Handle keys for string filtering."""
log.keyboard.debug("Got filter key 0x{:x} text {}".format(
e.key(), e.text()))
- if e.key() == Qt.Key.Key_Backspace:
+ if e.key() == core.Qt.Key.Key_Backspace:
log.keyboard.debug("Got backspace, mode {}, filtertext '{}', "
"sequence '{}'".format(self._last_press,
self._filtertext,
@@ -186,7 +185,7 @@ class HintKeyParser(basekeyparser.BaseKeyParser):
if self._last_press != LastPress.keystring and self._filtertext:
self._filtertext = self._filtertext[:-1]
self._hintmanager.filter_hints(self._filtertext)
- return QKeySequence.SequenceMatch.ExactMatch
+ return gui.QKeySequence.SequenceMatch.ExactMatch
elif self._last_press == LastPress.keystring and self._sequence:
self._sequence = self._sequence[:-1]
self.keystring_updated.emit(str(self._sequence))
@@ -195,21 +194,21 @@ class HintKeyParser(basekeyparser.BaseKeyParser):
# in numeric mode after the number has been deleted).
self._hintmanager.filter_hints(self._filtertext)
self._last_press = LastPress.filtertext
- return QKeySequence.SequenceMatch.ExactMatch
+ return gui.QKeySequence.SequenceMatch.ExactMatch
else:
- return QKeySequence.SequenceMatch.NoMatch
+ return gui.QKeySequence.SequenceMatch.NoMatch
elif self._hintmanager.current_mode() != 'number':
- return QKeySequence.SequenceMatch.NoMatch
+ return gui.QKeySequence.SequenceMatch.NoMatch
elif not e.text():
- return QKeySequence.SequenceMatch.NoMatch
+ return gui.QKeySequence.SequenceMatch.NoMatch
else:
self._filtertext += e.text()
self._hintmanager.filter_hints(self._filtertext)
self._last_press = LastPress.filtertext
- return QKeySequence.SequenceMatch.ExactMatch
+ return gui.QKeySequence.SequenceMatch.ExactMatch
- def handle(self, e: QKeyEvent, *,
- dry_run: bool = False) -> QKeySequence.SequenceMatch:
+ def handle(self, e: gui.QKeyEvent, *,
+ dry_run: bool = False) -> gui.QKeySequence.SequenceMatch:
"""Handle a new keypress and call the respective handlers."""
if dry_run:
return super().handle(e, dry_run=True)
@@ -217,18 +216,18 @@ class HintKeyParser(basekeyparser.BaseKeyParser):
assert not dry_run
if (self._command_parser.handle(e, dry_run=True) !=
- QKeySequence.SequenceMatch.NoMatch):
+ gui.QKeySequence.SequenceMatch.NoMatch):
log.keyboard.debug("Handling key via command parser")
self.clear_keystring()
return self._command_parser.handle(e)
match = super().handle(e)
- if match == QKeySequence.SequenceMatch.PartialMatch:
+ if match == gui.QKeySequence.SequenceMatch.PartialMatch:
self._last_press = LastPress.keystring
- elif match == QKeySequence.SequenceMatch.ExactMatch:
+ elif match == gui.QKeySequence.SequenceMatch.ExactMatch:
self._last_press = LastPress.none
- elif match == QKeySequence.SequenceMatch.NoMatch:
+ elif match == gui.QKeySequence.SequenceMatch.NoMatch:
# We couldn't find a keychain so we check if it's a special key.
return self._handle_filter_key(e)
else:
@@ -268,17 +267,17 @@ class RegisterKeyParser(CommandKeyParser):
def __init__(self, *, win_id: int,
mode: usertypes.KeyMode,
commandrunner: 'runners.CommandRunner',
- parent: QObject = None) -> None:
+ parent: core.QObject = None) -> None:
super().__init__(mode=usertypes.KeyMode.register, win_id=win_id,
commandrunner=commandrunner, parent=parent,
supports_count=False)
self._register_mode = mode
- def handle(self, e: QKeyEvent, *,
- dry_run: bool = False) -> QKeySequence.SequenceMatch:
+ def handle(self, e: gui.QKeyEvent, *,
+ dry_run: bool = False) -> gui.QKeySequence.SequenceMatch:
"""Override to always match the next key and use the register."""
match = super().handle(e, dry_run=dry_run)
- if match != QKeySequence.SequenceMatch.NoMatch or dry_run:
+ if match != gui.QKeySequence.SequenceMatch.NoMatch or dry_run:
return match
try:
@@ -286,10 +285,10 @@ class RegisterKeyParser(CommandKeyParser):
except keyutils.InvalidKeyError as ex:
# See https://github.com/qutebrowser/qutebrowser/issues/7047
log.keyboard.debug(f"Got invalid key: {ex}")
- return QKeySequence.SequenceMatch.NoMatch
+ return gui.QKeySequence.SequenceMatch.NoMatch
if info.is_special():
# this is not a proper register key, let it pass and keep going
- return QKeySequence.SequenceMatch.NoMatch
+ return gui.QKeySequence.SequenceMatch.NoMatch
key = e.text()
@@ -313,4 +312,4 @@ class RegisterKeyParser(CommandKeyParser):
self.request_leave.emit(
self._register_mode, "valid register key", True)
- return QKeySequence.SequenceMatch.ExactMatch
+ return gui.QKeySequence.SequenceMatch.ExactMatch
diff --git a/qutebrowser/mainwindow/mainwindow.py b/qutebrowser/mainwindow/mainwindow.py
index 74a1f517e..5552e2660 100644
--- a/qutebrowser/mainwindow/mainwindow.py
+++ b/qutebrowser/mainwindow/mainwindow.py
@@ -24,11 +24,7 @@ import base64
import itertools
import functools
from typing import List, MutableSequence, Optional, Tuple
-
-from qutebrowser.qt.core import (pyqtBoundSignal, pyqtSlot, QRect, QPoint, QTimer, Qt,
- QCoreApplication, QEventLoop, QByteArray)
-from qutebrowser.qt.widgets import QWidget, QVBoxLayout, QSizePolicy
-from qutebrowser.qt.gui import QPalette
+from qutebrowser.qt import widgets, gui
from qutebrowser.commands import runners
from qutebrowser.api import cmdutils
@@ -40,7 +36,7 @@ from qutebrowser.completion import completionwidget, completer
from qutebrowser.keyinput import modeman
from qutebrowser.browser import downloadview, hints, downloads
from qutebrowser.misc import crashsignal, keyhintwidget, sessions, objects
-from qutebrowser.qt import sip
+from qutebrowser.qt import core, sip
win_id_gen = itertools.count(0)
@@ -88,12 +84,12 @@ def get_window(*, via_ipc: bool,
def raise_window(window, alert=True):
"""Raise the given MainWindow object."""
- window.setWindowState(window.windowState() & ~Qt.WindowState.WindowMinimized)
- window.setWindowState(window.windowState() | Qt.WindowState.WindowActive)
+ window.setWindowState(window.windowState() & ~core.Qt.WindowState.WindowMinimized)
+ window.setWindowState(window.windowState() | core.Qt.WindowState.WindowActive)
window.raise_()
# WORKAROUND for https://bugreports.qt.io/browse/QTBUG-69568
- QCoreApplication.processEvents(
- QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents | QEventLoop.ProcessEventsFlag.ExcludeSocketNotifiers)
+ core.QCoreApplication.processEvents(
+ core.QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents | core.QEventLoop.ProcessEventsFlag.ExcludeSocketNotifiers)
if not sip.isdeleted(window):
# Could be deleted by the events run above
@@ -118,10 +114,10 @@ def get_target_window():
return None
-_OverlayInfoType = Tuple[QWidget, pyqtBoundSignal, bool, str]
+_OverlayInfoType = Tuple[widgets.QWidget, core.pyqtBoundSignal, bool, str]
-class MainWindow(QWidget):
+class MainWindow(widgets.QWidget):
"""The main window of qutebrowser.
@@ -187,8 +183,8 @@ class MainWindow(QWidget):
def __init__(self, *,
private: bool,
- geometry: Optional[QByteArray] = None,
- parent: Optional[QWidget] = None) -> None:
+ geometry: Optional[core.QByteArray] = None,
+ parent: Optional[widgets.QWidget] = None) -> None:
"""Create a new main window.
Args:
@@ -202,10 +198,10 @@ class MainWindow(QWidget):
from qutebrowser.mainwindow import tabbedbrowser
from qutebrowser.mainwindow.statusbar import bar
- self.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose)
+ self.setAttribute(core.Qt.WidgetAttribute.WA_DeleteOnClose)
if config.val.window.transparent:
- self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground)
- self.palette().setColor(QPalette.ColorRole.Window, Qt.GlobalColor.transparent)
+ self.setAttribute(core.Qt.WidgetAttribute.WA_TranslucentBackground)
+ self.palette().setColor(gui.QPalette.ColorRole.Window, core.Qt.GlobalColor.transparent)
self._overlays: MutableSequence[_OverlayInfoType] = []
self.win_id = next(win_id_gen)
@@ -218,7 +214,7 @@ class MainWindow(QWidget):
window=self.win_id)
self.setWindowTitle('qutebrowser')
- self._vbox = QVBoxLayout(self)
+ self._vbox = widgets.QVBoxLayout(self)
self._vbox.setContentsMargins(0, 0, 0, 0)
self._vbox.setSpacing(0)
@@ -272,7 +268,7 @@ class MainWindow(QWidget):
# When we're here the statusbar might not even really exist yet, so
# resizing will fail. Therefore, we use singleShot QTimers to make sure
# we defer this until everything else is initialized.
- QTimer.singleShot(0, self._connect_overlay_signals)
+ core.QTimer.singleShot(0, self._connect_overlay_signals)
config.instance.changed.connect(self._on_config_changed)
objects.qapp.new_window.emit(self)
@@ -305,7 +301,7 @@ class MainWindow(QWidget):
if not widget.isVisible():
return
- if widget.sizePolicy().horizontalPolicy() == QSizePolicy.Policy.Expanding:
+ if widget.sizePolicy().horizontalPolicy() == widgets.QSizePolicy.Policy.Expanding:
width = self.width() - 2 * padding
if widget.hasHeightForWidth():
height = widget.heightForWidth(width)
@@ -329,8 +325,8 @@ class MainWindow(QWidget):
bottom = self.height()
top = self.height() - status_height - height
top = qtutils.check_overflow(top, 'int', fatal=False)
- topleft = QPoint(left, max(height_padding, top))
- bottomright = QPoint(left + width, bottom)
+ topleft = core.QPoint(left, max(height_padding, top))
+ bottomright = core.QPoint(left + width, bottom)
elif status_position == 'top':
if self.status.isVisible():
status_height = self.status.height()
@@ -338,15 +334,15 @@ class MainWindow(QWidget):
else:
status_height = 0
top = 0
- topleft = QPoint(left, top)
+ topleft = core.QPoint(left, top)
bottom = status_height + height
bottom = qtutils.check_overflow(bottom, 'int', fatal=False)
- bottomright = QPoint(left + width,
+ bottomright = core.QPoint(left + width,
min(self.height() - height_padding, bottom))
else:
raise ValueError("Invalid position {}!".format(status_position))
- rect = QRect(topleft, bottomright)
+ rect = core.QRect(topleft, bottomright)
log.misc.debug('new geometry for {!r}: {}'.format(widget, rect))
if rect.isValid():
widget.setGeometry(rect)
@@ -398,7 +394,7 @@ class MainWindow(QWidget):
def __repr__(self):
return utils.get_repr(self)
- @pyqtSlot(str)
+ @core.pyqtSlot(str)
def _on_config_changed(self, option):
"""Resize the completion if related config options changed."""
if option == 'statusbar.padding':
@@ -416,7 +412,7 @@ class MainWindow(QWidget):
self._vbox.removeWidget(self.tabbed_browser.widget)
self._vbox.removeWidget(self._downloadview)
self._vbox.removeWidget(self.status)
- widgets: List[QWidget] = [self.tabbed_browser.widget]
+ widgets: List[widgets.QWidget] = [self.tabbed_browser.widget]
downloads_position = config.val.downloads.position
if downloads_position == 'top':
@@ -478,7 +474,7 @@ class MainWindow(QWidget):
def _set_default_geometry(self):
"""Set some sensible default geometry."""
- self.setGeometry(QRect(50, 50, 800, 600))
+ self.setGeometry(core.QRect(50, 50, 800, 600))
def _connect_signals(self):
"""Connect all mainwindow signals."""
@@ -564,27 +560,27 @@ class MainWindow(QWidget):
def _set_decoration(self, hidden):
"""Set the visibility of the window decoration via Qt."""
- window_flags = Qt.WindowType.Window
+ window_flags = core.Qt.WindowType.Window
refresh_window = self.isVisible()
if hidden:
- window_flags |= Qt.WindowType.CustomizeWindowHint | Qt.WindowType.NoDropShadowWindowHint
+ window_flags |= core.Qt.WindowType.CustomizeWindowHint | core.Qt.WindowType.NoDropShadowWindowHint
self.setWindowFlags(window_flags)
if refresh_window:
self.show()
- @pyqtSlot(bool)
+ @core.pyqtSlot(bool)
def _on_fullscreen_requested(self, on):
if not config.val.content.fullscreen.window:
if on:
self.state_before_fullscreen = self.windowState()
- self.setWindowState(Qt.WindowState.WindowFullScreen | self.state_before_fullscreen)
+ self.setWindowState(core.Qt.WindowState.WindowFullScreen | self.state_before_fullscreen)
elif self.isFullScreen():
self.setWindowState(self.state_before_fullscreen)
log.misc.debug('on: {}, state before fullscreen: {}'.format(
- on, debug.qflags_key(Qt, self.state_before_fullscreen)))
+ on, debug.qflags_key(core.Qt, self.state_before_fullscreen)))
@cmdutils.register(instance='main-window', scope='window')
- @pyqtSlot()
+ @core.pyqtSlot()
def close(self):
"""Close the current window.
diff --git a/qutebrowser/mainwindow/messageview.py b/qutebrowser/mainwindow/messageview.py
index d76a8b0e2..7a9169188 100644
--- a/qutebrowser/mainwindow/messageview.py
+++ b/qutebrowser/mainwindow/messageview.py
@@ -21,14 +21,12 @@
from typing import MutableSequence, Optional
-from qutebrowser.qt.core import pyqtSlot, pyqtSignal, QTimer, Qt
-from qutebrowser.qt.widgets import QWidget, QVBoxLayout, QLabel, QSizePolicy
-
from qutebrowser.config import config, stylesheet
from qutebrowser.utils import usertypes, message
+from qutebrowser.qt import widgets, core
-class Message(QLabel):
+class Message(widgets.QLabel):
"""A single error/warning/info message."""
@@ -37,13 +35,13 @@ class Message(QLabel):
level: usertypes.MessageLevel,
text: str,
replace: Optional[str],
- text_format: Qt.TextFormat,
- parent: QWidget = None,
+ text_format: core.Qt.TextFormat,
+ parent: widgets.QWidget = None,
) -> None:
super().__init__(text, parent)
self.replace = replace
self.level = level
- self.setAttribute(Qt.WidgetAttribute.WA_StyledBackground, True)
+ self.setAttribute(core.Qt.WidgetAttribute.WA_StyledBackground, True)
self.setWordWrap(True)
self.setTextFormat(text_format)
qss = """
@@ -77,12 +75,12 @@ class Message(QLabel):
stylesheet.set_register(self, qss, update=False)
@staticmethod
- def _text_format(info: message.MessageInfo) -> Qt.TextFormat:
+ def _text_format(info: message.MessageInfo) -> core.Qt.TextFormat:
"""The Qt.TextFormat to use based on the given MessageInfo."""
- return Qt.TextFormat.RichText if info.rich else Qt.TextFormat.PlainText
+ return core.Qt.TextFormat.RichText if info.rich else core.Qt.TextFormat.PlainText
@classmethod
- def from_info(cls, info: message.MessageInfo, parent: QWidget = None) -> "Message":
+ def from_info(cls, info: message.MessageInfo, parent: widgets.QWidget = None) -> "Message":
return cls(
level=info.level,
text=info.text,
@@ -102,21 +100,21 @@ class Message(QLabel):
self.setText(info.text)
-class MessageView(QWidget):
+class MessageView(widgets.QWidget):
"""Widget which stacks error/warning/info messages."""
- update_geometry = pyqtSignal()
+ update_geometry = core.pyqtSignal()
def __init__(self, parent=None):
super().__init__(parent)
self._messages: MutableSequence[Message] = []
- self._vbox = QVBoxLayout(self)
+ self._vbox = widgets.QVBoxLayout(self)
self._vbox.setContentsMargins(0, 0, 0, 0)
self._vbox.setSpacing(0)
- self.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed)
+ self.setSizePolicy(widgets.QSizePolicy.Policy.Expanding, widgets.QSizePolicy.Policy.Fixed)
- self._clear_timer = QTimer()
+ self._clear_timer = core.QTimer()
self._clear_timer.timeout.connect(self.clear_messages)
config.instance.changed.connect(self._set_clear_timer_interval)
@@ -136,7 +134,7 @@ class MessageView(QWidget):
widget.hide()
widget.deleteLater()
- @pyqtSlot()
+ @core.pyqtSlot()
def clear_messages(self):
"""Hide and delete all messages."""
for widget in self._messages:
@@ -146,7 +144,7 @@ class MessageView(QWidget):
self.hide()
self._clear_timer.stop()
- @pyqtSlot(message.MessageInfo)
+ @core.pyqtSlot(message.MessageInfo)
def show_message(self, info: message.MessageInfo) -> None:
"""Show the given message with the given MessageLevel."""
if info == self._last_info:
@@ -173,5 +171,5 @@ class MessageView(QWidget):
def mousePressEvent(self, e):
"""Clear messages when they are clicked on."""
- if e.button() in [Qt.MouseButton.LeftButton, Qt.MouseButton.MiddleButton, Qt.MouseButton.RightButton]:
+ if e.button() in [core.Qt.MouseButton.LeftButton, core.Qt.MouseButton.MiddleButton, core.Qt.MouseButton.RightButton]:
self.clear_messages()
diff --git a/qutebrowser/mainwindow/prompt.py b/qutebrowser/mainwindow/prompt.py
index 2d2990e88..fce32a29e 100644
--- a/qutebrowser/mainwindow/prompt.py
+++ b/qutebrowser/mainwindow/prompt.py
@@ -25,13 +25,7 @@ import collections
import functools
import dataclasses
from typing import Deque, MutableSequence, Optional, cast
-
-from qutebrowser.qt.core import (pyqtSlot, pyqtSignal, Qt, QTimer, QDir, QModelIndex,
- QItemSelectionModel, QObject, QEventLoop)
-from qutebrowser.qt.widgets import (QWidget, QGridLayout, QVBoxLayout, QLineEdit,
- QLabel, QTreeView, QSizePolicy,
- QSpacerItem)
-from qutebrowser.qt.gui import QFileSystemModel
+from qutebrowser.qt import widgets, gui
from qutebrowser.browser import downloads
from qutebrowser.config import config, configtypes, configexc, stylesheet
@@ -39,6 +33,7 @@ from qutebrowser.utils import usertypes, log, utils, qtutils, objreg, message
from qutebrowser.keyinput import modeman
from qutebrowser.api import cmdutils
from qutebrowser.utils import urlmatch
+from qutebrowser.qt import core
prompt_queue = cast('PromptQueue', None)
@@ -63,7 +58,7 @@ class UnsupportedOperationError(Error):
"""Raised when the prompt class doesn't support the requested operation."""
-class PromptQueue(QObject):
+class PromptQueue(core.QObject):
"""Global manager and queue for upcoming prompts.
@@ -97,7 +92,7 @@ class PromptQueue(QObject):
shown.
"""
- show_prompts = pyqtSignal(usertypes.Question)
+ show_prompts = core.pyqtSignal(usertypes.Question)
def __init__(self, parent=None):
super().__init__(parent)
@@ -113,7 +108,7 @@ class PromptQueue(QObject):
def _pop_later(self):
"""Helper to call self._pop as soon as everything else is done."""
- QTimer.singleShot(0, self._pop)
+ core.QTimer.singleShot(0, self._pop)
def _pop(self):
"""Pop a question from the queue and ask it, if there are any."""
@@ -146,7 +141,7 @@ class PromptQueue(QObject):
else:
return False
- @pyqtSlot(usertypes.Question, bool)
+ @core.pyqtSlot(usertypes.Question, bool)
def ask_question(self, question, blocking):
"""Display a prompt for a given question.
@@ -196,7 +191,7 @@ class PromptQueue(QObject):
question.completed.connect(loop.quit)
question.completed.connect(loop.deleteLater)
log.prompt.debug("Starting loop.exec() for {}".format(question))
- flags = QEventLoop.ProcessEventsFlag.ExcludeSocketNotifiers
+ flags = core.QEventLoop.ProcessEventsFlag.ExcludeSocketNotifiers
loop.exec(flags)
log.prompt.debug("Ending loop.exec() for {}".format(question))
@@ -214,7 +209,7 @@ class PromptQueue(QObject):
question.completed.connect(self._pop_later)
return None
- @pyqtSlot(usertypes.KeyMode)
+ @core.pyqtSlot(usertypes.KeyMode)
def _on_mode_left(self, mode):
"""Abort question when a prompt mode was left."""
if mode not in [usertypes.KeyMode.prompt, usertypes.KeyMode.yesno]:
@@ -232,7 +227,7 @@ class PromptQueue(QObject):
self._question = None
-class PromptContainer(QWidget):
+class PromptContainer(widgets.QWidget):
"""Container for prompts to be shown above the statusbar.
@@ -283,17 +278,17 @@ class PromptContainer(QWidget):
background-color: {{ conf.colors.prompts.selected.bg }};
}
"""
- update_geometry = pyqtSignal()
+ update_geometry = core.pyqtSignal()
def __init__(self, win_id, parent=None):
super().__init__(parent)
- self._layout = QVBoxLayout(self)
+ self._layout = widgets.QVBoxLayout(self)
self._layout.setContentsMargins(10, 10, 10, 10)
self._win_id = win_id
self._prompt: Optional[_BasePrompt] = None
self.setObjectName('PromptContainer')
- self.setAttribute(Qt.WidgetAttribute.WA_StyledBackground, True)
+ self.setAttribute(core.Qt.WidgetAttribute.WA_StyledBackground, True)
stylesheet.set_register(self)
message.global_bridge.prompt_done.connect(self._on_prompt_done)
@@ -303,7 +298,7 @@ class PromptContainer(QWidget):
def __repr__(self):
return utils.get_repr(self, win_id=self._win_id)
- @pyqtSlot(usertypes.Question)
+ @core.pyqtSlot(usertypes.Question)
def _on_show_prompts(self, question):
"""Show a prompt for the given question.
@@ -349,7 +344,7 @@ class PromptContainer(QWidget):
prompt.setFocus()
self.update_geometry.emit()
- @pyqtSlot()
+ @core.pyqtSlot()
def _on_aborted(self, key_mode):
"""Leave KEY_MODE whenever a prompt is aborted."""
try:
@@ -358,12 +353,12 @@ class PromptContainer(QWidget):
# window was deleted: ignore
pass
- @pyqtSlot(usertypes.KeyMode)
+ @core.pyqtSlot(usertypes.KeyMode)
def _on_prompt_done(self, key_mode):
"""Leave the prompt mode in this window if a question was answered."""
modeman.leave(self._win_id, key_mode, ':prompt-accept', maybe=True)
- @pyqtSlot(usertypes.KeyMode)
+ @core.pyqtSlot(usertypes.KeyMode)
def _on_global_mode_left(self, mode):
"""Leave prompt/yesno mode in this window if it was left elsewhere.
@@ -493,7 +488,7 @@ class PromptContainer(QWidget):
self.prompt_accept(folders[0])
-class LineEdit(QLineEdit):
+class LineEdit(widgets.QLineEdit):
"""A line edit used in prompts."""
@@ -504,11 +499,11 @@ class LineEdit(QLineEdit):
background-color: transparent;
}
""")
- self.setAttribute(Qt.WidgetAttribute.WA_MacShowFocusRect, False)
+ self.setAttribute(core.Qt.WidgetAttribute.WA_MacShowFocusRect, False)
def keyPressEvent(self, e):
"""Override keyPressEvent to paste primary selection on Shift + Ins."""
- if e.key() == Qt.Key.Key_Insert and e.modifiers() == Qt.KeyboardModifier.ShiftModifier:
+ if e.key() == core.Qt.Key.Key_Insert and e.modifiers() == core.Qt.KeyboardModifier.ShiftModifier:
try:
text = utils.get_clipboard(selection=True, fallback=True)
except utils.ClipboardError: # pragma: no cover
@@ -523,7 +518,7 @@ class LineEdit(QLineEdit):
return utils.get_repr(self)
-class _BasePrompt(QWidget):
+class _BasePrompt(widgets.QWidget):
"""Base class for all prompts."""
@@ -532,7 +527,7 @@ class _BasePrompt(QWidget):
def __init__(self, question, parent=None):
super().__init__(parent)
self.question = question
- self._vbox = QVBoxLayout(self)
+ self._vbox = widgets.QVBoxLayout(self)
self._vbox.setSpacing(15)
self._key_grid = None
@@ -543,18 +538,18 @@ class _BasePrompt(QWidget):
assert question.title is not None, question
title = '<font size="4"><b>{}</b></font>'.format(
html.escape(question.title))
- title_label = QLabel(title, self)
+ title_label = widgets.QLabel(title, self)
self._vbox.addWidget(title_label)
if question.text is not None:
# Not doing any HTML escaping here as the text can be formatted
- text_label = QLabel(question.text)
+ text_label = widgets.QLabel(question.text)
text_label.setWordWrap(True)
- text_label.setTextInteractionFlags(Qt.TextInteractionFlag.TextSelectableByMouse)
+ text_label.setTextInteractionFlags(core.Qt.TextInteractionFlag.TextSelectableByMouse)
self._vbox.addWidget(text_label)
def _init_key_label(self):
assert self._key_grid is None, self._key_grid
- self._key_grid = QGridLayout()
+ self._key_grid = widgets.QGridLayout()
self._key_grid.setVerticalSpacing(0)
all_bindings = config.key_instance.get_reverse_bindings_for(
@@ -573,24 +568,24 @@ class _BasePrompt(QWidget):
binding = pref
if binding is None:
binding = bindings[0]
- key_label = QLabel('<b>{}</b>'.format(html.escape(binding)))
+ key_label = widgets.QLabel('<b>{}</b>'.format(html.escape(binding)))
else:
- key_label = QLabel(f'<b>unbound</b> (<tt>{html.escape(cmd)}</tt>)')
+ key_label = widgets.QLabel(f'<b>unbound</b> (<tt>{html.escape(cmd)}</tt>)')
- text_label = QLabel(text)
+ text_label = widgets.QLabel(text)
labels.append((key_label, text_label))
for i, (key_label, text_label) in enumerate(labels):
self._key_grid.addWidget(key_label, i, 0)
self._key_grid.addWidget(text_label, i, 1)
- spacer = QSpacerItem(0, 0, QSizePolicy.Policy.Expanding)
+ spacer = widgets.QSpacerItem(0, 0, widgets.QSizePolicy.Policy.Expanding)
self._key_grid.addItem(spacer, 0, 2)
self._vbox.addLayout(self._key_grid)
if not has_bindings:
- label = QLabel(
+ label = widgets.QLabel(
"<b>Note:</b> You seem to have unbound all keys for this prompt "
f"(<tt>{self.KEY_MODE.name}</tt> key mode)."
"<br/>Run <tt>qutebrowser :CMD</tt> with a command from above to "
@@ -666,10 +661,10 @@ class FilenamePrompt(_BasePrompt):
self._set_fileview_root(question.default)
if config.val.prompt.filebrowser:
- self.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred)
+ self.setSizePolicy(widgets.QSizePolicy.Policy.Expanding, widgets.QSizePolicy.Policy.Preferred)
self._to_complete = ''
- self._root_index = QModelIndex()
+ self._root_index = core.QModelIndex()
def _directories_hide_show_model(self):
"""Get rid of non-matching directories."""
@@ -680,7 +675,7 @@ class FilenamePrompt(_BasePrompt):
hidden = self._to_complete not in filename and filename != '..'
self._file_view.setRowHidden(index.row(), index.parent(), hidden)
- @pyqtSlot(str)
+ @core.pyqtSlot(str)
def _set_fileview_root(self, path, *, tabbed=False):
"""Set the root path for the file display."""
separators = os.sep
@@ -716,7 +711,7 @@ class FilenamePrompt(_BasePrompt):
self._directories_hide_show_model()
- @pyqtSlot(QModelIndex)
+ @core.pyqtSlot(core.QModelIndex)
def _insert_path(self, index, *, clicked=True):
"""Handle an element selection.
@@ -724,7 +719,7 @@ class FilenamePrompt(_BasePrompt):
index: The QModelIndex of the selected element.
clicked: Whether the element was clicked.
"""
- if index == QModelIndex():
+ if index == core.QModelIndex():
path = os.path.join(self._file_model.rootPath(), self._to_complete)
else:
path = os.path.normpath(self._file_model.filePath(index))
@@ -741,11 +736,11 @@ class FilenamePrompt(_BasePrompt):
self._set_fileview_root(path, tabbed=True)
if clicked:
# Avoid having a ..-subtree highlighted
- self._file_view.setCurrentIndex(QModelIndex())
+ self._file_view.setCurrentIndex(core.QModelIndex())
def _init_fileview(self):
- self._file_view = QTreeView(self)
- self._file_model = QFileSystemModel(self)
+ self._file_view = widgets.QTreeView(self)
+ self._file_model = gui.QFileSystemModel(self)
self._file_view.setModel(self._file_model)
self._file_view.clicked.connect(self._insert_path)
@@ -759,7 +754,7 @@ class FilenamePrompt(_BasePrompt):
for col in range(1, 4):
self._file_view.setColumnHidden(col, True)
# Nothing selected initially
- self._file_view.setCurrentIndex(QModelIndex())
+ self._file_view.setCurrentIndex(core.QModelIndex())
# The model needs to be sorted so we get the correct first/last index
self._file_model.directoryLoaded.connect(
lambda: self._file_model.sort(0))
@@ -809,8 +804,8 @@ class FilenamePrompt(_BasePrompt):
selmodel.setCurrentIndex(
idx,
- QItemSelectionModel.SelectionFlag.ClearAndSelect |
- QItemSelectionModel.SelectionFlag.Rows)
+ core.QItemSelectionModel.SelectionFlag.ClearAndSelect |
+ core.QItemSelectionModel.SelectionFlag.Rows)
self._insert_path(idx, clicked=False)
def _do_completion(self, idx, which):
@@ -833,7 +828,7 @@ class DownloadFilenamePrompt(FilenamePrompt):
def __init__(self, question, parent=None):
super().__init__(question, parent)
self._file_model.setFilter(
- QDir.Filter.AllDirs | QDir.Filter.Drives | QDir.Filter.NoDotAndDotDot)
+ core.QDir.Filter.AllDirs | core.QDir.Filter.Drives | core.QDir.Filter.NoDotAndDotDot)
def accept(self, value=None, save=False):
done = super().accept(value, save)
@@ -873,14 +868,14 @@ class AuthenticationPrompt(_BasePrompt):
super().__init__(question, parent)
self._init_texts(question)
- user_label = QLabel("Username:", self)
+ user_label = widgets.QLabel("Username:", self)
self._user_lineedit = LineEdit(self)
- password_label = QLabel("Password:", self)
+ password_label = widgets.QLabel("Password:", self)
self._password_lineedit = LineEdit(self)
- self._password_lineedit.setEchoMode(QLineEdit.EchoMode.Password)
+ self._password_lineedit.setEchoMode(widgets.QLineEdit.EchoMode.Password)
- grid = QGridLayout()
+ grid = widgets.QGridLayout()
grid.addWidget(user_label, 1, 0)
grid.addWidget(self._user_lineedit, 1, 1)
grid.addWidget(password_label, 2, 0)
@@ -1013,4 +1008,4 @@ def init():
global prompt_queue
prompt_queue = PromptQueue()
message.global_bridge.ask_question.connect( # type: ignore[call-arg]
- prompt_queue.ask_question, Qt.ConnectionType.DirectConnection)
+ prompt_queue.ask_question, core.Qt.ConnectionType.DirectConnection)
diff --git a/qutebrowser/mainwindow/statusbar/bar.py b/qutebrowser/mainwindow/statusbar/bar.py
index 1205b5466..96020296b 100644
--- a/qutebrowser/mainwindow/statusbar/bar.py
+++ b/qutebrowser/mainwindow/statusbar/bar.py
@@ -22,9 +22,6 @@
import enum
import dataclasses
-from qutebrowser.qt.core import pyqtSignal, pyqtSlot, pyqtProperty, Qt, QSize, QTimer
-from qutebrowser.qt.widgets import QWidget, QHBoxLayout, QStackedLayout, QSizePolicy
-
from qutebrowser.browser import browsertab
from qutebrowser.config import config, stylesheet
from qutebrowser.keyinput import modeman
@@ -32,6 +29,7 @@ from qutebrowser.utils import usertypes, log, objreg, utils
from qutebrowser.mainwindow.statusbar import (backforward, command, progress,
keystring, percentage, url,
tabindex, textbase, clock, searchmatch)
+from qutebrowser.qt import widgets, core
@dataclasses.dataclass
@@ -132,7 +130,7 @@ def _generate_stylesheet():
return qss
-class StatusBar(QWidget):
+class StatusBar(widgets.QWidget):
"""The statusbar at the bottom of the mainwindow.
@@ -157,28 +155,28 @@ class StatusBar(QWidget):
arg: The new position.
"""
- resized = pyqtSignal('QRect')
- moved = pyqtSignal('QPoint')
+ resized = core.pyqtSignal('QRect')
+ moved = core.pyqtSignal('QPoint')
STYLESHEET = _generate_stylesheet()
def __init__(self, *, win_id, private, parent=None):
super().__init__(parent)
self.setObjectName(self.__class__.__name__)
- self.setAttribute(Qt.WidgetAttribute.WA_StyledBackground)
+ self.setAttribute(core.Qt.WidgetAttribute.WA_StyledBackground)
stylesheet.set_register(self)
- self.setSizePolicy(QSizePolicy.Policy.Ignored, QSizePolicy.Policy.Fixed)
+ self.setSizePolicy(widgets.QSizePolicy.Policy.Ignored, widgets.QSizePolicy.Policy.Fixed)
self._win_id = win_id
self._color_flags = ColorFlags()
self._color_flags.private = private
- self._hbox = QHBoxLayout(self)
+ self._hbox = widgets.QHBoxLayout(self)
self._set_hbox_padding()
self._hbox.setSpacing(5)
- self._stack = QStackedLayout()
+ self._stack = widgets.QStackedLayout()
self._hbox.addLayout(self._stack)
self._stack.setContentsMargins(0, 0, 0, 0)
@@ -207,7 +205,7 @@ class StatusBar(QWidget):
self._draw_widgets()
config.instance.changed.connect(self._on_config_changed)
- QTimer.singleShot(0, self.maybe_hide)
+ core.QTimer.singleShot(0, self.maybe_hide)
def __repr__(self):
return utils.get_repr(self)
@@ -239,7 +237,7 @@ class StatusBar(QWidget):
else:
raise utils.Unreachable(key)
- @pyqtSlot(str)
+ @core.pyqtSlot(str)
def _on_config_changed(self, option):
if option == 'statusbar.show':
self.maybe_hide()
@@ -286,12 +284,12 @@ class StatusBar(QWidget):
for widget in [self.url, self.percentage,
self.backforward, self.tabindex,
self.keystring, self.prog, self.clock, *self._text_widgets]:
- assert isinstance(widget, QWidget)
+ assert isinstance(widget, widgets.QWidget)
widget.hide()
self._hbox.removeWidget(widget)
self._text_widgets.clear()
- @pyqtSlot()
+ @core.pyqtSlot()
def maybe_hide(self):
"""Hide the statusbar if it's configured to do so."""
strategy = config.val.statusbar.show
@@ -319,7 +317,7 @@ class StatusBar(QWidget):
padding = config.val.statusbar.padding
self._hbox.setContentsMargins(padding.left, 0, padding.right, 0)
- @pyqtProperty('QStringList') # type: ignore[type-var]
+ @core.pyqtProperty('QStringList') # type: ignore[type-var]
def color_flags(self):
"""Getter for self.color_flags, so it can be used as Qt property."""
return self._color_flags.to_stringlist()
@@ -381,13 +379,13 @@ class StatusBar(QWidget):
self._stack.setCurrentWidget(self.txt)
self.maybe_hide()
- @pyqtSlot(str)
+ @core.pyqtSlot(str)
def set_text(self, text):
"""Set a normal (persistent) text in the status bar."""
log.message.debug(text)
self.txt.setText(text)
- @pyqtSlot(usertypes.KeyMode)
+ @core.pyqtSlot(usertypes.KeyMode)
def on_mode_entered(self, mode):
"""Mark certain modes in the commandline."""
mode_manager = modeman.instance(self._win_id)
@@ -403,7 +401,7 @@ class StatusBar(QWidget):
usertypes.KeyMode.passthrough]:
self.set_mode_active(mode, True)
- @pyqtSlot(usertypes.KeyMode, usertypes.KeyMode)
+ @core.pyqtSlot(usertypes.KeyMode, usertypes.KeyMode)
def on_mode_left(self, old_mode, new_mode):
"""Clear marked mode."""
mode_manager = modeman.instance(self._win_id)
@@ -422,7 +420,7 @@ class StatusBar(QWidget):
usertypes.KeyMode.passthrough]:
self.set_mode_active(old_mode, False)
- @pyqtSlot(browsertab.AbstractTab)
+ @core.pyqtSlot(browsertab.AbstractTab)
def on_tab_changed(self, tab):
"""Notify sub-widgets when the tab has been changed."""
self.url.on_tab_changed(tab)
@@ -432,7 +430,7 @@ class StatusBar(QWidget):
self.maybe_hide()
assert tab.is_private == self._color_flags.private
- @pyqtSlot(browsertab.SelectionState)
+ @core.pyqtSlot(browsertab.SelectionState)
def on_caret_selection_toggled(self, selection_state):
"""Update the statusbar when entering/leaving caret selection mode."""
log.statusbar.debug("Setting caret selection {}"
@@ -471,4 +469,4 @@ class StatusBar(QWidget):
padding = config.cache['statusbar.padding']
width = super().minimumSizeHint().width()
height = self.fontMetrics().height() + padding.top + padding.bottom
- return QSize(width, height)
+ return core.QSize(width, height)
diff --git a/qutebrowser/mainwindow/statusbar/clock.py b/qutebrowser/mainwindow/statusbar/clock.py
index ebab152b7..97c9cfab5 100644
--- a/qutebrowser/mainwindow/statusbar/clock.py
+++ b/qutebrowser/mainwindow/statusbar/clock.py
@@ -20,9 +20,8 @@
"""Clock displayed in the statusbar."""
from datetime import datetime
-from qutebrowser.qt.core import Qt, QTimer
-
from qutebrowser.mainwindow.statusbar import textbase
+from qutebrowser.qt import core
class Clock(textbase.TextBase):
@@ -32,10 +31,10 @@ class Clock(textbase.TextBase):
UPDATE_DELAY = 500 # ms
def __init__(self, parent=None):
- super().__init__(parent, elidemode=Qt.TextElideMode.ElideNone)
+ super().__init__(parent, elidemode=core.Qt.TextElideMode.ElideNone)
self.format = ""
- self.timer = QTimer(self)
+ self.timer = core.QTimer(self)
self.timer.timeout.connect(self._show_time)
def _show_time(self):
diff --git a/qutebrowser/mainwindow/statusbar/command.py b/qutebrowser/mainwindow/statusbar/command.py
index df85d0dfa..255038fac 100644
--- a/qutebrowser/mainwindow/statusbar/command.py
+++ b/qutebrowser/mainwindow/statusbar/command.py
@@ -20,10 +20,7 @@
"""The commandline in the statusbar."""
from typing import Optional
-
-from qutebrowser.qt.core import pyqtSignal, pyqtSlot, Qt, QSize
-from qutebrowser.qt.gui import QKeyEvent
-from qutebrowser.qt.widgets import QSizePolicy, QWidget
+from qutebrowser.qt import widgets, gui
from qutebrowser.keyinput import modeman, modeparsers
from qutebrowser.api import cmdutils
@@ -31,6 +28,7 @@ from qutebrowser.misc import cmdhistory, editor
from qutebrowser.misc import miscwidgets as misc
from qutebrowser.utils import usertypes, log, objreg, message, utils
from qutebrowser.config import config
+from qutebrowser.qt import core
class Command(misc.MinimalLineEditMixin, misc.CommandLineEdit):
@@ -52,17 +50,17 @@ class Command(misc.MinimalLineEditMixin, misc.CommandLineEdit):
hide_cmd: Emitted when command input can be hidden.
"""
- got_cmd = pyqtSignal([str], [str, int])
- got_search = pyqtSignal(str, bool) # text, reverse
- clear_completion_selection = pyqtSignal()
- hide_completion = pyqtSignal()
- update_completion = pyqtSignal()
- show_cmd = pyqtSignal()
- hide_cmd = pyqtSignal()
+ got_cmd = core.pyqtSignal([str], [str, int])
+ got_search = core.pyqtSignal(str, bool) # text, reverse
+ clear_completion_selection = core.pyqtSignal()
+ hide_completion = core.pyqtSignal()
+ update_completion = core.pyqtSignal()
+ show_cmd = core.pyqtSignal()
+ hide_cmd = core.pyqtSignal()
def __init__(self, *, win_id: int,
private: bool,
- parent: QWidget = None) -> None:
+ parent: widgets.QWidget = None) -> None:
misc.CommandLineEdit.__init__(self, parent=parent)
misc.MinimalLineEditMixin.__init__(self)
self._win_id = win_id
@@ -70,7 +68,7 @@ class Command(misc.MinimalLineEditMixin, misc.CommandLineEdit):
command_history = objreg.get('command-history')
self.history.history = command_history.data
self.history.changed.connect(command_history.changed)
- self.setSizePolicy(QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Ignored)
+ self.setSizePolicy(widgets.QSizePolicy.Policy.MinimumExpanding, widgets.QSizePolicy.Policy.Ignored)
self.cursorPositionChanged.connect(self.update_completion)
self.textChanged.connect(self.update_completion)
@@ -223,7 +221,7 @@ class Command(misc.MinimalLineEditMixin, misc.CommandLineEdit):
ed.file_updated.connect(callback)
ed.edit(self.text())
- @pyqtSlot(usertypes.KeyMode)
+ @core.pyqtSlot(usertypes.KeyMode)
def on_mode_left(self, mode: usertypes.KeyMode) -> None:
"""Clear up when command mode was left.
@@ -252,7 +250,7 @@ class Command(misc.MinimalLineEditMixin, misc.CommandLineEdit):
"'{}'!".format(text))
super().setText(text)
- def keyPressEvent(self, e: QKeyEvent) -> None:
+ def keyPressEvent(self, e: gui.QKeyEvent) -> None:
"""Override keyPressEvent to ignore Return key presses.
If this widget is focused, we are in passthrough key mode, and
@@ -260,27 +258,27 @@ class Command(misc.MinimalLineEditMixin, misc.CommandLineEdit):
without command_accept to be called.
"""
text = self.text()
- if text in modeparsers.STARTCHARS and e.key() == Qt.Key.Key_Backspace:
+ if text in modeparsers.STARTCHARS and e.key() == core.Qt.Key.Key_Backspace:
e.accept()
modeman.leave(self._win_id, usertypes.KeyMode.command,
'prefix deleted')
return
- if e.key() == Qt.Key.Key_Return:
+ if e.key() == core.Qt.Key.Key_Return:
e.ignore()
return
else:
super().keyPressEvent(e)
- def sizeHint(self) -> QSize:
+ def sizeHint(self) -> core.QSize:
"""Dynamically calculate the needed size."""
height = super().sizeHint().height()
text = self.text()
if not text:
text = 'x'
width = self.fontMetrics().boundingRect(text).width()
- return QSize(width, height)
+ return core.QSize(width, height)
- @pyqtSlot()
+ @core.pyqtSlot()
def _incremental_search(self) -> None:
if not config.val.search.incremental:
return
diff --git a/qutebrowser/mainwindow/statusbar/keystring.py b/qutebrowser/mainwindow/statusbar/keystring.py
index ed8b56318..5ed53836f 100644
--- a/qutebrowser/mainwindow/statusbar/keystring.py
+++ b/qutebrowser/mainwindow/statusbar/keystring.py
@@ -19,7 +19,7 @@
"""Keychain string displayed in the statusbar."""
-from qutebrowser.qt.core import pyqtSlot
+from qutebrowser.qt import core
from qutebrowser.mainwindow.statusbar import textbase
from qutebrowser.utils import usertypes
@@ -29,6 +29,6 @@ class KeyString(textbase.TextBase):
"""Keychain string displayed in the statusbar."""
- @pyqtSlot(usertypes.KeyMode, str)
+ @core.pyqtSlot(usertypes.KeyMode, str)
def on_keystring_updated(self, _mode, keystr):
self.setText(keystr)
diff --git a/qutebrowser/mainwindow/statusbar/percentage.py b/qutebrowser/mainwindow/statusbar/percentage.py
index 6ecdc4659..1452fa47d 100644
--- a/qutebrowser/mainwindow/statusbar/percentage.py
+++ b/qutebrowser/mainwindow/statusbar/percentage.py
@@ -19,11 +19,10 @@
"""Scroll percentage displayed in the statusbar."""
-from qutebrowser.qt.core import pyqtSlot, Qt
-
from qutebrowser.mainwindow.statusbar import textbase
from qutebrowser.misc import throttle
from qutebrowser.utils import utils
+from qutebrowser.qt import core
class Percentage(textbase.TextBase):
@@ -32,7 +31,7 @@ class Percentage(textbase.TextBase):
def __init__(self, parent=None):
"""Constructor. Set percentage to 0%."""
- super().__init__(parent, elidemode=Qt.TextElideMode.ElideNone)
+ super().__init__(parent, elidemode=core.Qt.TextElideMode.ElideNone)
self._strings = self._calc_strings()
self._set_text = throttle.Throttle(self.setText, 100, parent=self)
self.set_perc(0, 0)
@@ -47,7 +46,7 @@ class Percentage(textbase.TextBase):
strings.update({0: '[top]', 100: '[bot]'})
return strings
- @pyqtSlot(int, int)
+ @core.pyqtSlot(int, int)
def set_perc(self, x, y):
"""Setter to be used as a Qt slot.
diff --git a/qutebrowser/mainwindow/statusbar/progress.py b/qutebrowser/mainwindow/statusbar/progress.py
index f76367b38..9053fe7da 100644
--- a/qutebrowser/mainwindow/statusbar/progress.py
+++ b/qutebrowser/mainwindow/statusbar/progress.py
@@ -19,14 +19,12 @@
"""The progress bar in the statusbar."""
-from qutebrowser.qt.core import pyqtSlot, QSize
-from qutebrowser.qt.widgets import QProgressBar, QSizePolicy
-
from qutebrowser.config import stylesheet
from qutebrowser.utils import utils, usertypes
+from qutebrowser.qt import widgets, core
-class Progress(QProgressBar):
+class Progress(widgets.QProgressBar):
"""The progress bar part of the status bar."""
@@ -47,20 +45,20 @@ class Progress(QProgressBar):
super().__init__(parent)
stylesheet.set_register(self)
self.enabled = False
- self.setSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed)
+ self.setSizePolicy(widgets.QSizePolicy.Policy.Fixed, widgets.QSizePolicy.Policy.Fixed)
self.setTextVisible(False)
self.hide()
def __repr__(self):
return utils.get_repr(self, value=self.value())
- @pyqtSlot()
+ @core.pyqtSlot()
def on_load_started(self):
"""Clear old error and show progress, used as slot to loadStarted."""
self.setValue(0)
self.setVisible(self.enabled)
- @pyqtSlot(int)
+ @core.pyqtSlot(int)
def on_load_progress(self, value):
"""Hide the statusbar when loading finished.
@@ -85,7 +83,7 @@ class Progress(QProgressBar):
"""Set the height to the text height."""
width = super().sizeHint().width()
height = self.fontMetrics().height()
- return QSize(width, height)
+ return core.QSize(width, height)
def minimumSizeHint(self):
return self.sizeHint()
diff --git a/qutebrowser/mainwindow/statusbar/searchmatch.py b/qutebrowser/mainwindow/statusbar/searchmatch.py
index 7c9a5b05e..599e14ca4 100644
--- a/qutebrowser/mainwindow/statusbar/searchmatch.py
+++ b/qutebrowser/mainwindow/statusbar/searchmatch.py
@@ -20,7 +20,7 @@
"""The search match indicator in the statusbar."""
-from qutebrowser.qt.core import pyqtSlot
+from qutebrowser.qt import core
from qutebrowser.browser import browsertab
from qutebrowser.mainwindow.statusbar import textbase
@@ -31,7 +31,7 @@ class SearchMatch(textbase.TextBase):
"""The part of the statusbar that displays the search match counter."""
- @pyqtSlot(browsertab.SearchMatch)
+ @core.pyqtSlot(browsertab.SearchMatch)
def set_match(self, search_match: browsertab.SearchMatch) -> None:
"""Set the match counts in the statusbar.
diff --git a/qutebrowser/mainwindow/statusbar/tabindex.py b/qutebrowser/mainwindow/statusbar/tabindex.py
index e41501123..27cc1beee 100644
--- a/qutebrowser/mainwindow/statusbar/tabindex.py
+++ b/qutebrowser/mainwindow/statusbar/tabindex.py
@@ -19,7 +19,7 @@
"""TabIndex displayed in the statusbar."""
-from qutebrowser.qt.core import pyqtSlot
+from qutebrowser.qt import core
from qutebrowser.mainwindow.statusbar import textbase
@@ -28,7 +28,7 @@ class TabIndex(textbase.TextBase):
"""Shows current tab index and number of tabs in the statusbar."""
- @pyqtSlot(int, int)
+ @core.pyqtSlot(int, int)
def on_tab_index_changed(self, current, count):
"""Update tab index when tab changed."""
self.setText('[{}/{}]'.format(current + 1, count))
diff --git a/qutebrowser/mainwindow/statusbar/textbase.py b/qutebrowser/mainwindow/statusbar/textbase.py
index 9ab4b9753..a974b4973 100644
--- a/qutebrowser/mainwindow/statusbar/textbase.py
+++ b/qutebrowser/mainwindow/statusbar/textbase.py
@@ -19,14 +19,12 @@
"""Base text widgets for statusbar."""
-from qutebrowser.qt.core import Qt
-from qutebrowser.qt.widgets import QLabel, QSizePolicy
-from qutebrowser.qt.gui import QPainter
+from qutebrowser.qt import widgets, gui, core
from qutebrowser.utils import qtutils, utils
-class TextBase(QLabel):
+class TextBase(widgets.QLabel):
"""A text in the statusbar.
@@ -40,9 +38,9 @@ class TextBase(QLabel):
_elided_text: The current elided text.
"""
- def __init__(self, parent=None, elidemode=Qt.TextElideMode.ElideRight):
+ def __init__(self, parent=None, elidemode=core.Qt.TextElideMode.ElideRight):
super().__init__(parent)
- self.setSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Minimum)
+ self.setSizePolicy(widgets.QSizePolicy.Policy.Preferred, widgets.QSizePolicy.Policy.Minimum)
self._elidemode = elidemode
self._elided_text = ''
@@ -57,7 +55,7 @@ class TextBase(QLabel):
"""
if self.text():
self._elided_text = self.fontMetrics().elidedText(
- self.text(), self._elidemode, width, Qt.TextFlag.TextShowMnemonic)
+ self.text(), self._elidemode, width, core.Qt.TextFlag.TextShowMnemonic)
else:
self._elided_text = ''
@@ -68,7 +66,7 @@ class TextBase(QLabel):
txt: The text to set (string).
"""
super().setText(txt)
- if self._elidemode != Qt.TextElideMode.ElideNone:
+ if self._elidemode != core.Qt.TextElideMode.ElideNone:
self._update_elided_text(self.geometry().width())
def resizeEvent(self, e):
@@ -80,11 +78,11 @@ class TextBase(QLabel):
def paintEvent(self, e):
"""Override QLabel::paintEvent to draw elided text."""
- if self._elidemode == Qt.TextElideMode.ElideNone:
+ if self._elidemode == core.Qt.TextElideMode.ElideNone:
super().paintEvent(e)
else:
e.accept()
- painter = QPainter(self)
+ painter = gui.QPainter(self)
geom = self.geometry()
qtutils.ensure_valid(geom)
painter.drawText(0, 0, geom.width(), geom.height(),
diff --git a/qutebrowser/mainwindow/statusbar/url.py b/qutebrowser/mainwindow/statusbar/url.py
index 27a2b2133..04cffea30 100644
--- a/qutebrowser/mainwindow/statusbar/url.py
+++ b/qutebrowser/mainwindow/statusbar/url.py
@@ -21,11 +21,10 @@
import enum
-from qutebrowser.qt.core import pyqtSlot, pyqtProperty, QUrl
-
from qutebrowser.mainwindow.statusbar import textbase
from qutebrowser.config import stylesheet
from qutebrowser.utils import usertypes, urlutils
+from qutebrowser.qt import core
class UrlType(enum.Enum):
@@ -91,7 +90,7 @@ class UrlText(textbase.TextBase):
self._normal_url = None
self._normal_url_type = UrlType.normal
- @pyqtProperty(str) # type: ignore[type-var]
+ @core.pyqtProperty(str) # type: ignore[type-var]
def urltype(self):
"""Getter for self.urltype, so it can be used as Qt property.
@@ -120,7 +119,7 @@ class UrlText(textbase.TextBase):
# always override the old one.
self.style().polish(self)
- @pyqtSlot(usertypes.LoadStatus)
+ @core.pyqtSlot(usertypes.LoadStatus)
def on_load_status_changed(self, status):
"""Slot for load_status_changed. Sets URL color accordingly.
@@ -137,7 +136,7 @@ class UrlText(textbase.TextBase):
self._normal_url_type = UrlType.normal
self._update_url()
- @pyqtSlot(QUrl)
+ @core.pyqtSlot(core.QUrl)
def set_url(self, url):
"""Setter to be used as a Qt slot.
@@ -153,7 +152,7 @@ class UrlText(textbase.TextBase):
self._normal_url_type = UrlType.normal
self._update_url()
- @pyqtSlot(str)
+ @core.pyqtSlot(str)
def set_hover_url(self, link):
"""Setter to be used as a Qt slot.
@@ -164,7 +163,7 @@ class UrlText(textbase.TextBase):
link: The link which was hovered (string)
"""
if link:
- qurl = QUrl(link)
+ qurl = core.QUrl(link)
if qurl.isValid():
self._hover_url = urlutils.safe_display_string(qurl)
else:
diff --git a/qutebrowser/mainwindow/tabbedbrowser.py b/qutebrowser/mainwindow/tabbedbrowser.py
index 487f3ea42..55fb08edc 100644
--- a/qutebrowser/mainwindow/tabbedbrowser.py
+++ b/qutebrowser/mainwindow/tabbedbrowser.py
@@ -27,9 +27,6 @@ import dataclasses
from typing import (
Any, Deque, List, Mapping, MutableMapping, MutableSequence, Optional, Tuple)
-from qutebrowser.qt.widgets import QSizePolicy, QWidget, QApplication
-from qutebrowser.qt.core import pyqtSignal, pyqtSlot, QTimer, QUrl, QPoint
-
from qutebrowser.config import config
from qutebrowser.keyinput import modeman
from qutebrowser.mainwindow import tabwidget, mainwindow
@@ -37,6 +34,7 @@ from qutebrowser.browser import signalfilter, browsertab, history
from qutebrowser.utils import (log, usertypes, utils, qtutils, objreg,
urlutils, message, jinja, version)
from qutebrowser.misc import quitter, objects
+from qutebrowser.qt import widgets, core
@dataclasses.dataclass
@@ -44,7 +42,7 @@ class _UndoEntry:
"""Information needed for :undo."""
- url: QUrl
+ url: core.QUrl
history: bytes
index: int
pinned: bool
@@ -147,7 +145,7 @@ class TabDeletedError(Exception):
"""Exception raised when _tab_index is called for a deleted tab."""
-class TabbedBrowser(QWidget):
+class TabbedBrowser(widgets.QWidget):
"""A TabWidget with QWebViews inside.
@@ -195,21 +193,21 @@ class TabbedBrowser(QWidget):
shutting_down: This TabbedBrowser will be deleted soon.
"""
- cur_progress = pyqtSignal(int)
- cur_load_started = pyqtSignal()
- cur_load_finished = pyqtSignal(bool)
- cur_url_changed = pyqtSignal(QUrl)
- cur_link_hovered = pyqtSignal(str)
- cur_scroll_perc_changed = pyqtSignal(int, int)
- cur_load_status_changed = pyqtSignal(usertypes.LoadStatus)
- cur_search_match_changed = pyqtSignal(browsertab.SearchMatch)
- cur_fullscreen_requested = pyqtSignal(bool)
- cur_caret_selection_toggled = pyqtSignal(browsertab.SelectionState)
- close_window = pyqtSignal()
- resized = pyqtSignal('QRect')
- current_tab_changed = pyqtSignal(browsertab.AbstractTab)
- new_tab = pyqtSignal(browsertab.AbstractTab, int)
- shutting_down = pyqtSignal()
+ cur_progress = core.pyqtSignal(int)
+ cur_load_started = core.pyqtSignal()
+ cur_load_finished = core.pyqtSignal(bool)
+ cur_url_changed = core.pyqtSignal(core.QUrl)
+ cur_link_hovered = core.pyqtSignal(str)
+ cur_scroll_perc_changed = core.pyqtSignal(int, int)
+ cur_load_status_changed = core.pyqtSignal(usertypes.LoadStatus)
+ cur_search_match_changed = core.pyqtSignal(browsertab.SearchMatch)
+ cur_fullscreen_requested = core.pyqtSignal(bool)
+ cur_caret_selection_toggled = core.pyqtSignal(browsertab.SelectionState)
+ close_window = core.pyqtSignal()
+ resized = core.pyqtSignal('QRect')
+ current_tab_changed = core.pyqtSignal(browsertab.AbstractTab)
+ new_tab = core.pyqtSignal(browsertab.AbstractTab, int)
+ shutting_down = core.pyqtSignal()
def __init__(self, *, win_id, private, parent=None):
if private:
@@ -225,7 +223,7 @@ class TabbedBrowser(QWidget):
self.widget.currentChanged.connect(self._on_current_changed)
self.cur_fullscreen_requested.connect(self.widget.tabBar().maybe_hide)
- self.widget.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
+ self.widget.setSizePolicy(widgets.QSizePolicy.Policy.Expanding, widgets.QSizePolicy.Policy.Expanding)
if (
objects.backend == usertypes.Backend.QtWebEngine and
@@ -248,8 +246,8 @@ class TabbedBrowser(QWidget):
self._now_focused = None
self.search_text = None
self.search_options: Mapping[str, Any] = {}
- self._local_marks: MutableMapping[QUrl, MutableMapping[str, QPoint]] = {}
- self._global_marks: MutableMapping[str, Tuple[QPoint, QUrl]] = {}
+ self._local_marks: MutableMapping[core.QUrl, MutableMapping[str, core.QPoint]] = {}
+ self._global_marks: MutableMapping[str, Tuple[core.QPoint, core.QUrl]] = {}
self.default_window_icon = self.widget.window().windowIcon()
self.is_private = private
self.tab_deque = TabDeque()
@@ -266,7 +264,7 @@ class TabbedBrowser(QWidget):
def __repr__(self):
return utils.get_repr(self, count=self.widget.count())
- @pyqtSlot(str)
+ @core.pyqtSlot(str)
def _on_config_changed(self, option):
if option == 'tabs.favicons.show':
self._update_favicons()
@@ -469,7 +467,7 @@ class TabbedBrowser(QWidget):
if last_close == 'close':
self.close_window.emit()
elif last_close == 'blank':
- self.load_url(QUrl('about:blank'), newtab=True)
+ self.load_url(core.QUrl('about:blank'), newtab=True)
elif last_close == 'startpage':
for url in config.val.url.start_pages:
self.load_url(url, newtab=True)
@@ -541,7 +539,7 @@ class TabbedBrowser(QWidget):
assert tab is not None
no_history = len(tab.history) == 1
urls = {
- 'blank': QUrl('about:blank'),
+ 'blank': core.QUrl('about:blank'),
'startpage': config.val.url.start_pages[0],
'default-page': config.val.url.default_page,
}
@@ -565,7 +563,7 @@ class TabbedBrowser(QWidget):
newtab.history.private_api.deserialize(entry.history)
newtab.set_pinned(entry.pinned)
- @pyqtSlot('QUrl', bool)
+ @core.pyqtSlot('QUrl', bool)
def load_url(self, url, newtab):
"""Open a URL, used as a slot.
@@ -579,7 +577,7 @@ class TabbedBrowser(QWidget):
else:
self._current_tab().load_url(url)
- @pyqtSlot(int)
+ @core.pyqtSlot(int)
def on_tab_close_requested(self, idx):
"""Close a tab via an index."""
tab = self._tab_by_idx(idx)
@@ -590,7 +588,7 @@ class TabbedBrowser(QWidget):
self.tab_close_prompt_if_pinned(
tab, False, lambda: self.close_tab(tab))
- @pyqtSlot(browsertab.AbstractTab)
+ @core.pyqtSlot(browsertab.AbstractTab)
def _on_window_close_requested(self, widget):
"""Close a tab with a widget given."""
try:
@@ -599,11 +597,11 @@ class TabbedBrowser(QWidget):
log.webview.debug("Requested to close {!r} which does not "
"exist!".format(widget))
- @pyqtSlot('QUrl')
- @pyqtSlot('QUrl', bool)
- @pyqtSlot('QUrl', bool, bool)
+ @core.pyqtSlot('QUrl')
+ @core.pyqtSlot('QUrl', bool)
+ @core.pyqtSlot('QUrl', bool, bool)
def tabopen(
- self, url: QUrl = None,
+ self, url: core.QUrl = None,
background: bool = None,
related: bool = True,
idx: int = None,
@@ -635,7 +633,7 @@ class TabbedBrowser(QWidget):
"related {}, idx {}".format(
url, background, related, idx))
- prev_focus = QApplication.focusWidget()
+ prev_focus = widgets.QApplication.focusWidget()
if config.val.tabs.tabs_are_windows and self.widget.count() > 0:
window = mainwindow.MainWindow(private=self.is_private)
@@ -729,7 +727,7 @@ class TabbedBrowser(QWidget):
for tab in self.widgets():
self.widget.update_tab_favicon(tab)
- @pyqtSlot()
+ @core.pyqtSlot()
def _on_load_started(self, tab):
"""Clear icon and update title when a tab started loading.
@@ -742,7 +740,7 @@ class TabbedBrowser(QWidget):
tab.data.should_show_icon()):
self.widget.window().setWindowIcon(self.default_window_icon)
- @pyqtSlot()
+ @core.pyqtSlot()
def _on_load_status_changed(self, tab):
"""Update tab/window titles if the load status changed."""
try:
@@ -755,7 +753,7 @@ class TabbedBrowser(QWidget):
if idx == self.widget.currentIndex():
self._update_window_title()
- @pyqtSlot()
+ @core.pyqtSlot()
def _leave_modes_on_load(self):
"""Leave insert/hint mode when loading started."""
try:
@@ -776,7 +774,7 @@ class TabbedBrowser(QWidget):
else:
log.modes.debug("Ignoring leave_on_load request due to setting.")
- @pyqtSlot(browsertab.AbstractTab, str)
+ @core.pyqtSlot(browsertab.AbstractTab, str)
def _on_title_changed(self, tab, text):
"""Set the title of a tab.
@@ -800,7 +798,7 @@ class TabbedBrowser(QWidget):
if idx == self.widget.currentIndex():
self._update_window_title()
- @pyqtSlot(browsertab.AbstractTab, QUrl)
+ @core.pyqtSlot(browsertab.AbstractTab, core.QUrl)
def _on_url_changed(self, tab, url):
"""Set the new URL as title if there's no title yet.
@@ -817,7 +815,7 @@ class TabbedBrowser(QWidget):
if not self.widget.page_title(idx):
self.widget.set_page_title(idx, url.toDisplayString())
- def _mode_override(self, url: QUrl) -> None:
+ def _mode_override(self, url: core.QUrl) -> None:
"""Override mode if url matches pattern.
Args:
@@ -834,7 +832,7 @@ class TabbedBrowser(QWidget):
reason='mode_override',
)
- @pyqtSlot(browsertab.AbstractTab)
+ @core.pyqtSlot(browsertab.AbstractTab)
def _on_icon_changed(self, tab):
"""Set the icon of a tab.
@@ -850,7 +848,7 @@ class TabbedBrowser(QWidget):
return
self.widget.update_tab_favicon(tab)
- @pyqtSlot(usertypes.KeyMode)
+ @core.pyqtSlot(usertypes.KeyMode)
def on_mode_entered(self, mode):
"""Save input mode when tabs.mode_on_change = restore."""
if (config.val.tabs.mode_on_change == 'restore' and
@@ -860,7 +858,7 @@ class TabbedBrowser(QWidget):
assert isinstance(tab, browsertab.AbstractTab), tab
tab.data.input_mode = mode
- @pyqtSlot(usertypes.KeyMode)
+ @core.pyqtSlot(usertypes.KeyMode)
def on_mode_left(self, mode):
"""Give focus to current tab if command mode was left."""
widget = self.widget.currentWidget()
@@ -874,7 +872,7 @@ class TabbedBrowser(QWidget):
assert isinstance(widget, browsertab.AbstractTab), widget
widget.data.input_mode = usertypes.KeyMode.normal
- @pyqtSlot(int)
+ @core.pyqtSlot(int)
def _on_current_changed(self, idx):
"""Add prev tab to stack and leave hinting mode when focus changed."""
mode_on_change = config.val.tabs.mode_on_change
@@ -911,11 +909,11 @@ class TabbedBrowser(QWidget):
self._now_focused = tab
self.current_tab_changed.emit(tab)
self.cur_search_match_changed.emit(tab.search.match)
- QTimer.singleShot(0, self._update_window_title)
+ core.QTimer.singleShot(0, self._update_window_title)
self._tab_insert_idx_left = self.widget.currentIndex()
self._tab_insert_idx_right = self.widget.currentIndex() + 1
- @pyqtSlot()
+ @core.pyqtSlot()
def on_cmd_return_pressed(self):
"""Set focus when the commandline closes."""
log.modes.debug("Commandline closed, focusing {!r}".format(self))
@@ -954,7 +952,7 @@ class TabbedBrowser(QWidget):
if idx == self.widget.currentIndex():
tab.private_api.handle_auto_insert_mode(ok)
- @pyqtSlot()
+ @core.pyqtSlot()
def _on_scroll_pos_changed(self):
"""Update tab and window title when scroll position changed."""
idx = self.widget.currentIndex()
@@ -1026,7 +1024,7 @@ class TabbedBrowser(QWidget):
error_page = jinja.render(
'error.html', title="Error loading {}".format(url_string),
url=url_string, error=msg)
- QTimer.singleShot(100, lambda: show_error_page(error_page))
+ core.QTimer.singleShot(100, lambda: show_error_page(error_page))
def resizeEvent(self, e):
"""Extend resizeEvent of QWidget to emit a resized signal afterwards.
@@ -1056,7 +1054,7 @@ class TabbedBrowser(QWidget):
"""
# strip the fragment as it may interfere with scrolling
try:
- url = self.current_url().adjusted(QUrl.UrlFormattingOption.RemoveFragment)
+ url = self.current_url().adjusted(core.QUrl.UrlFormattingOption.RemoveFragment)
except qtutils.QtValueError:
# show an error only if the mark is not automatically set
if key != "'":
@@ -1079,7 +1077,7 @@ class TabbedBrowser(QWidget):
"""
try:
# consider urls that differ only in fragment to be identical
- urlkey = self.current_url().adjusted(QUrl.UrlFormattingOption.RemoveFragment)
+ urlkey = self.current_url().adjusted(core.QUrl.UrlFormattingOption.RemoveFragment)
except qtutils.QtValueError:
urlkey = None
diff --git a/qutebrowser/mainwindow/tabwidget.py b/qutebrowser/mainwindow/tabwidget.py
index 170231f44..b12f40839 100644
--- a/qutebrowser/mainwindow/tabwidget.py
+++ b/qutebrowser/mainwindow/tabwidget.py
@@ -24,20 +24,14 @@ import contextlib
import dataclasses
from typing import Optional, Dict, Any
-from qutebrowser.qt.core import (pyqtSignal, pyqtSlot, Qt, QSize, QRect, QPoint,
- QTimer, QUrl)
-from qutebrowser.qt.widgets import (QTabWidget, QTabBar, QSizePolicy, QCommonStyle,
- QStyle, QStylePainter, QStyleOptionTab,
- QStyleFactory)
-from qutebrowser.qt.gui import QIcon, QPalette, QColor
-
from qutebrowser.utils import qtutils, objreg, utils, usertypes, log
from qutebrowser.config import config, stylesheet
from qutebrowser.misc import objects, debugcachestats
from qutebrowser.browser import browsertab
+from qutebrowser.qt import widgets, gui, core
-class TabWidget(QTabWidget):
+class TabWidget(widgets.QTabWidget):
"""The tab widget used for TabbedBrowser.
@@ -48,8 +42,8 @@ class TabWidget(QTabWidget):
new_tab_requested: Emitted when a new tab is requested.
"""
- tab_index_changed = pyqtSignal(int, int)
- new_tab_requested = pyqtSignal('QUrl', bool, bool)
+ tab_index_changed = core.pyqtSignal(int, int)
+ new_tab_requested = core.pyqtSignal('QUrl', bool, bool)
# Strings for controlling the mute/audible text
MUTE_STRING = '[M] '
@@ -62,12 +56,12 @@ class TabWidget(QTabWidget):
self.setTabBar(bar)
bar.tabCloseRequested.connect(self.tabCloseRequested)
bar.tabMoved.connect(functools.partial(
- QTimer.singleShot, 0, self.update_tab_titles))
+ core.QTimer.singleShot, 0, self.update_tab_titles))
bar.currentChanged.connect(self._on_current_changed)
bar.new_tab_requested.connect(self._on_new_tab_requested)
- self.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed)
+ self.setSizePolicy(widgets.QSizePolicy.Policy.Expanding, widgets.QSizePolicy.Policy.Fixed)
self.setDocumentMode(True)
- self.setElideMode(Qt.TextElideMode.ElideRight)
+ self.setElideMode(core.Qt.TextElideMode.ElideRight)
self.setUsesScrollButtons(True)
bar.setDrawBase(False)
self._init_config()
@@ -83,7 +77,7 @@ class TabWidget(QTabWidget):
self.setTabPosition(position)
tabbar = self.tab_bar()
tabbar.vertical = position in [
- QTabWidget.TabPosition.West, QTabWidget.TabPosition.East]
+ widgets.QTabWidget.TabPosition.West, widgets.QTabWidget.TabPosition.East]
tabbar.setSelectionBehaviorOnRemove(selection_behavior)
tabbar.refresh()
@@ -324,14 +318,14 @@ class TabWidget(QTabWidget):
self.set_page_title(new_idx, text)
return new_idx
- @pyqtSlot(int)
+ @core.pyqtSlot(int)
def _on_current_changed(self, index):
"""Emit the tab_index_changed signal if the current tab changed."""
self.tab_bar().on_current_changed()
self.update_tab_titles()
self.tab_index_changed.emit(index, self.count())
- @pyqtSlot()
+ @core.pyqtSlot()
def _on_new_tab_requested(self):
"""Open a new tab."""
self.new_tab_requested.emit(config.val.url.default_page, False, False)
@@ -343,7 +337,7 @@ class TabWidget(QTabWidget):
The tab URL as QUrl.
"""
tab = self._tab_by_idx(idx)
- url = QUrl() if tab is None else tab.url()
+ url = core.QUrl() if tab is None else tab.url()
# It's possible for url to be invalid, but the caller will handle that.
qtutils.ensure_valid(url)
return url
@@ -352,13 +346,13 @@ class TabWidget(QTabWidget):
"""Update favicon of the given tab."""
idx = self.indexOf(tab)
- icon = tab.icon() if tab.data.should_show_icon() else QIcon()
+ icon = tab.icon() if tab.data.should_show_icon() else gui.QIcon()
self.setTabIcon(idx, icon)
if config.val.tabs.tabs_are_windows:
self.window().setWindowIcon(tab.icon())
- def setTabIcon(self, idx: int, icon: QIcon) -> None:
+ def setTabIcon(self, idx: int, icon: gui.QIcon) -> None:
"""Always show tab icons for pinned tabs in some circumstances."""
tab = self._tab_by_idx(idx)
if (icon.isNull() and
@@ -366,11 +360,11 @@ class TabWidget(QTabWidget):
config.cache['tabs.pinned.shrink'] and
not self.tab_bar().vertical and
tab is not None and tab.data.pinned):
- icon = self.style().standardIcon(QStyle.StandardPixmap.SP_FileIcon)
+ icon = self.style().standardIcon(widgets.QStyle.StandardPixmap.SP_FileIcon)
super().setTabIcon(idx, icon)
-class TabBar(QTabBar):
+class TabBar(widgets.QTabBar):
"""Custom tab bar with our own style.
@@ -399,14 +393,14 @@ class TabBar(QTabBar):
}
"""
- new_tab_requested = pyqtSignal()
+ new_tab_requested = core.pyqtSignal()
def __init__(self, win_id, parent=None):
super().__init__(parent)
self._win_id = win_id
self.setStyle(TabBarStyle())
self.vertical = False
- self._auto_hide_timer = QTimer()
+ self._auto_hide_timer = core.QTimer()
self._auto_hide_timer.setSingleShot(True)
self._auto_hide_timer.timeout.connect(self.maybe_hide)
self._on_show_switching_delay_changed()
@@ -419,7 +413,7 @@ class TabBar(QTabBar):
self.ensurePolished()
config.instance.changed.connect(self._on_config_changed)
self._set_icon_size()
- QTimer.singleShot(0, self.maybe_hide)
+ core.QTimer.singleShot(0, self.maybe_hide)
self._minimum_tab_size_hint_helper = functools.lru_cache(maxsize=2**9)(
self._minimum_tab_size_hint_helper_uncached
)
@@ -443,7 +437,7 @@ class TabBar(QTabBar):
"""Get the current tab object."""
return self._tab_widget().currentWidget()
- @pyqtSlot(str)
+ @core.pyqtSlot(str)
def _on_config_changed(self, option: str) -> None:
if option.startswith('fonts.tabs.'):
self.ensurePolished()
@@ -480,7 +474,7 @@ class TabBar(QTabBar):
self.show()
self._auto_hide_timer.start()
- @pyqtSlot()
+ @core.pyqtSlot()
def maybe_hide(self):
"""Hide the tab bar if needed."""
show = config.val.tabs.show
@@ -518,7 +512,7 @@ class TabBar(QTabBar):
try:
return self.tab_data(idx, 'indicator-color')
except KeyError:
- return QColor()
+ return gui.QColor()
def page_title(self, idx):
"""Get the tab title user data.
@@ -541,7 +535,7 @@ class TabBar(QTabBar):
"""Set the tab bar favicon size."""
size = self.fontMetrics().height() - 2
size = int(size * config.val.tabs.favicons.scale)
- self.setIconSize(QSize(size, size))
+ self.setIconSize(core.QSize(size, size))
def mouseReleaseEvent(self, e):
"""Override mouseReleaseEvent to know when drags stop."""
@@ -554,8 +548,8 @@ class TabBar(QTabBar):
Also keep track of if we are currently in a drag."""
self.drag_in_progress = True
button = config.val.tabs.close_mouse_button
- if (e.button() == Qt.MouseButton.RightButton and button == 'right' or
- e.button() == Qt.MouseButton.MiddleButton and button == 'middle'):
+ if (e.button() == core.Qt.MouseButton.RightButton and button == 'right' or
+ e.button() == core.Qt.MouseButton.MiddleButton and button == 'middle'):
e.accept()
idx = self.tabAt(e.pos())
if idx == -1:
@@ -573,7 +567,7 @@ class TabBar(QTabBar):
return
super().mousePressEvent(e)
- def minimumTabSizeHint(self, index: int, ellipsis: bool = True) -> QSize:
+ def minimumTabSizeHint(self, index: int, ellipsis: bool = True) -> core.QSize:
"""Set the minimum tab size to indicator/icon/... text.
Args:
@@ -602,7 +596,7 @@ class TabBar(QTabBar):
def _minimum_tab_size_hint_helper_uncached(self, tab_text: str,
icon_width: int,
- ellipsis: bool, pinned: bool) -> QSize:
+ ellipsis: bool, pinned: bool) -> core.QSize:
"""Helper function to cache tab results.
Config values accessed in here should be added to _on_config_changed to
@@ -613,7 +607,7 @@ class TabBar(QTabBar):
def _text_to_width(text):
# Calculate text width taking into account qt mnemonics
- return self.fontMetrics().size(Qt.TextFlag.TextShowMnemonic, text).width()
+ return self.fontMetrics().size(core.Qt.TextFlag.TextShowMnemonic, text).width()
text_width = min(_text_to_width(text),
_text_to_width(tab_text))
padding = config.cache['tabs.padding']
@@ -631,7 +625,7 @@ class TabBar(QTabBar):
if (not self.vertical and min_width > 0 and
not pinned or not config.cache['tabs.pinned.shrink']):
width = max(min_width, width)
- return QSize(width, height)
+ return core.QSize(width, height)
def _minimum_tab_height_uncached(self):
padding = config.cache['tabs.padding']
@@ -650,7 +644,7 @@ class TabBar(QTabBar):
return False
return widget.data.pinned
- def tabSizeHint(self, index: int) -> QSize:
+ def tabSizeHint(self, index: int) -> core.QSize:
"""Override tabSizeHint to customize qb's tab size.
https://wiki.python.org/moin/PyQt/Customising%20tab%20bars
@@ -665,7 +659,7 @@ class TabBar(QTabBar):
# This happens on startup on macOS.
# We return it directly rather than setting `size' because we don't
# want to ensure it's valid in this special case.
- return QSize()
+ return core.QSize()
height = self._minimum_tab_height()
if self.vertical:
@@ -677,7 +671,7 @@ class TabBar(QTabBar):
width = main_window.width() * perc // 100
else:
width = int(confwidth)
- size = QSize(width, height)
+ size = core.QSize(width, height)
else:
if config.cache['tabs.pinned.shrink'] and self._tab_pinned(index):
# Give pinned tabs the minimum size they need to display their
@@ -691,20 +685,20 @@ class TabBar(QTabBar):
max_width = config.cache['tabs.max_width']
if max_width > 0:
width = min(max_width, width)
- size = QSize(width, height)
+ size = core.QSize(width, height)
qtutils.ensure_valid(size)
return size
def paintEvent(self, event):
"""Override paintEvent to draw the tabs like we want to."""
- p = QStylePainter(self)
+ p = widgets.QStylePainter(self)
selected = self.currentIndex()
for idx in range(self.count()):
if not event.region().intersects(self.tabRect(idx)):
# Don't repaint if we are outside the requested region
continue
- tab = QStyleOptionTab()
+ tab = widgets.QStyleOptionTab()
self.initStyleOption(tab, idx)
setting = 'colors.tabs'
@@ -714,14 +708,14 @@ class TabBar(QTabBar):
setting += '.selected'
setting += '.odd' if (idx + 1) % 2 else '.even'
- tab.palette.setColor(QPalette.ColorRole.Window,
+ tab.palette.setColor(gui.QPalette.ColorRole.Window,
config.cache[setting + '.bg'])
- tab.palette.setColor(QPalette.ColorRole.WindowText,
+ tab.palette.setColor(gui.QPalette.ColorRole.WindowText,
config.cache[setting + '.fg'])
indicator_color = self.tab_indicator_color(idx)
- tab.palette.setColor(QPalette.ColorRole.Base, indicator_color)
- p.drawControl(QStyle.ControlElement.CE_TabBarTab, tab)
+ tab.palette.setColor(gui.QPalette.ColorRole.Base, indicator_color)
+ p.drawControl(widgets.QStyle.ControlElement.CE_TabBarTab, tab)
def tabInserted(self, idx):
"""Update visibility when a tab was inserted."""
@@ -769,12 +763,12 @@ class Layouts:
Used by TabBarStyle._tab_layout().
"""
- text: QRect
- icon: QRect
- indicator: QRect
+ text: core.QRect
+ icon: core.QRect
+ indicator: core.QRect
-class TabBarStyle(QCommonStyle):
+class TabBarStyle(widgets.QCommonStyle):
"""Qt style used by TabBar to fix some issues with the default one.
@@ -799,7 +793,7 @@ class TabBarStyle(QCommonStyle):
This simply calls the corresponding function in self._style.
"""
- self._style = QStyleFactory.create('Fusion')
+ self._style = widgets.QStyleFactory.create('Fusion')
for method in ['drawComplexControl', 'drawItemPixmap',
'generatedIconPixmap', 'hitTestComplexControl',
'itemPixmapRect', 'itemTextRect', 'polish', 'styleHint',
@@ -831,12 +825,12 @@ class TabBarStyle(QCommonStyle):
p: QPainter
"""
qtutils.ensure_valid(layouts.icon)
- icon_mode = (QIcon.Mode.Normal if opt.state & QStyle.StateFlag.State_Enabled
- else QIcon.Mode.Disabled)
- icon_state = (QIcon.State.On if opt.state & QStyle.StateFlag.State_Selected
- else QIcon.State.Off)
+ icon_mode = (gui.QIcon.Mode.Normal if opt.state & widgets.QStyle.StateFlag.State_Enabled
+ else gui.QIcon.Mode.Disabled)
+ icon_state = (gui.QIcon.State.On if opt.state & widgets.QStyle.StateFlag.State_Selected
+ else gui.QIcon.State.Off)
icon = opt.icon.pixmap(opt.iconSize, icon_mode, icon_state)
- self._style.drawItemPixmap(p, layouts.icon, Qt.AlignmentFlag.AlignCenter, icon)
+ self._style.drawItemPixmap(p, layouts.icon, core.Qt.AlignmentFlag.AlignCenter, icon)
def drawControl(self, element, opt, p, widget=None):
"""Override drawControl to draw odd tabs in a different color.
@@ -850,8 +844,8 @@ class TabBarStyle(QCommonStyle):
p: QPainter
widget: QWidget
"""
- if element not in [QStyle.ControlElement.CE_TabBarTab, QStyle.ControlElement.CE_TabBarTabShape,
- QStyle.ControlElement.CE_TabBarTabLabel]:
+ if element not in [widgets.QStyle.ControlElement.CE_TabBarTab, widgets.QStyle.ControlElement.CE_TabBarTabShape,
+ widgets.QStyle.ControlElement.CE_TabBarTabLabel]:
# Let the real style draw it.
self._style.drawControl(element, opt, p, widget)
return
@@ -861,28 +855,28 @@ class TabBarStyle(QCommonStyle):
log.misc.warning("Could not get layouts for tab!")
return
- if element == QStyle.ControlElement.CE_TabBarTab:
+ if element == widgets.QStyle.ControlElement.CE_TabBarTab:
# We override this so we can control TabBarTabShape/TabBarTabLabel.
- self.drawControl(QStyle.ControlElement.CE_TabBarTabShape, opt, p, widget)
- self.drawControl(QStyle.ControlElement.CE_TabBarTabLabel, opt, p, widget)
- elif element == QStyle.ControlElement.CE_TabBarTabShape:
+ self.drawControl(widgets.QStyle.ControlElement.CE_TabBarTabShape, opt, p, widget)
+ self.drawControl(widgets.QStyle.ControlElement.CE_TabBarTabLabel, opt, p, widget)
+ elif element == widgets.QStyle.ControlElement.CE_TabBarTabShape:
p.fillRect(opt.rect, opt.palette.window())
self._draw_indicator(layouts, opt, p)
# We use super() rather than self._style here because we don't want
# any sophisticated drawing.
- super().drawControl(QStyle.ControlElement.CE_TabBarTabShape, opt, p, widget)
- elif element == QStyle.ControlElement.CE_TabBarTabLabel:
+ super().drawControl(widgets.QStyle.ControlElement.CE_TabBarTabShape, opt, p, widget)
+ elif element == widgets.QStyle.ControlElement.CE_TabBarTabLabel:
if not opt.icon.isNull() and layouts.icon.isValid():
self._draw_icon(layouts, opt, p)
alignment = (config.cache['tabs.title.alignment'] |
- Qt.AlignmentFlag.AlignVCenter | Qt.TextFlag.TextHideMnemonic)
+ core.Qt.AlignmentFlag.AlignVCenter | core.Qt.TextFlag.TextHideMnemonic)
self._style.drawItemText(p,
layouts.text,
int(alignment),
opt.palette,
- bool(opt.state & QStyle.StateFlag.State_Enabled),
+ bool(opt.state & widgets.QStyle.StateFlag.State_Enabled),
opt.text,
- QPalette.ColorRole.WindowText)
+ gui.QPalette.ColorRole.WindowText)
else:
raise ValueError("Invalid element {!r}".format(element))
@@ -897,11 +891,11 @@ class TabBarStyle(QCommonStyle):
Return:
An int.
"""
- if metric in [QStyle.PixelMetric.PM_TabBarTabShiftHorizontal,
- QStyle.PixelMetric.PM_TabBarTabShiftVertical,
- QStyle.PixelMetric.PM_TabBarTabHSpace,
- QStyle.PixelMetric.PM_TabBarTabVSpace,
- QStyle.PixelMetric.PM_TabBarScrollButtonWidth]:
+ if metric in [widgets.QStyle.PixelMetric.PM_TabBarTabShiftHorizontal,
+ widgets.QStyle.PixelMetric.PM_TabBarTabShiftVertical,
+ widgets.QStyle.PixelMetric.PM_TabBarTabHSpace,
+ widgets.QStyle.PixelMetric.PM_TabBarTabVSpace,
+ widgets.QStyle.PixelMetric.PM_TabBarScrollButtonWidth]:
return 0
else:
return self._style.pixelMetric(metric, option, widget)
@@ -917,14 +911,14 @@ class TabBarStyle(QCommonStyle):
Return:
A QRect.
"""
- if sr == QStyle.SubElement.SE_TabBarTabText:
+ if sr == widgets.QStyle.SubElement.SE_TabBarTabText:
layouts = self._tab_layout(opt)
if layouts is None:
log.misc.warning("Could not get layouts for tab!")
- return QRect()
+ return core.QRect()
return layouts.text
- elif sr in [QStyle.SubElement.SE_TabWidgetTabBar,
- QStyle.SubElement.SE_TabBarScrollLeftButton]:
+ elif sr in [widgets.QStyle.SubElement.SE_TabWidgetTabBar,
+ widgets.QStyle.SubElement.SE_TabBarScrollLeftButton]:
# Handling SE_TabBarScrollLeftButton so the left scroll button is
# aligned properly. Otherwise, empty space will be shown after the
# last tab even though the button width is set to 0
@@ -952,7 +946,7 @@ class TabBarStyle(QCommonStyle):
padding = config.cache['tabs.padding']
indicator_padding = config.cache['tabs.indicator.padding']
- text_rect = QRect(opt.rect)
+ text_rect = core.QRect(opt.rect)
if not text_rect.isValid():
# This happens sometimes according to crash reports, but no idea
# why...
@@ -963,9 +957,9 @@ class TabBarStyle(QCommonStyle):
indicator_width = config.cache['tabs.indicator.width']
if indicator_width == 0:
- indicator_rect = QRect()
+ indicator_rect = core.QRect()
else:
- indicator_rect = QRect(opt.rect)
+ indicator_rect = core.QRect(opt.rect)
qtutils.ensure_valid(indicator_rect)
indicator_rect.adjust(padding.left + indicator_padding.left,
padding.top + indicator_padding.top,
@@ -997,24 +991,24 @@ class TabBarStyle(QCommonStyle):
"""
icon_size = opt.iconSize
if not icon_size.isValid():
- icon_extent = self.pixelMetric(QStyle.PixelMetric.PM_SmallIconSize)
- icon_size = QSize(icon_extent, icon_extent)
- icon_mode = (QIcon.Mode.Normal if opt.state & QStyle.StateFlag.State_Enabled
- else QIcon.Mode.Disabled)
- icon_state = (QIcon.State.On if opt.state & QStyle.StateFlag.State_Selected
- else QIcon.State.Off)
+ icon_extent = self.pixelMetric(widgets.QStyle.PixelMetric.PM_SmallIconSize)
+ icon_size = core.QSize(icon_extent, icon_extent)
+ icon_mode = (gui.QIcon.Mode.Normal if opt.state & widgets.QStyle.StateFlag.State_Enabled
+ else gui.QIcon.Mode.Disabled)
+ icon_state = (gui.QIcon.State.On if opt.state & widgets.QStyle.StateFlag.State_Selected
+ else gui.QIcon.State.Off)
# reserve space for favicon when tab bar is vertical (issue #1968)
position = config.cache['tabs.position']
- if (position in [QTabWidget.TabPosition.East, QTabWidget.TabPosition.West] and
+ if (position in [widgets.QTabWidget.TabPosition.East, widgets.QTabWidget.TabPosition.West] and
config.cache['tabs.favicons.show'] != 'never'):
tab_icon_size = icon_size
else:
actual_size = opt.icon.actualSize(icon_size, icon_mode, icon_state)
- tab_icon_size = QSize(
+ tab_icon_size = core.QSize(
min(actual_size.width(), icon_size.width()),
min(actual_size.height(), icon_size.height()))
icon_top = text_rect.center().y() + 1 - tab_icon_size.height() // 2
- icon_rect = QRect(QPoint(text_rect.left(), icon_top), tab_icon_size)
+ icon_rect = core.QRect(core.QPoint(text_rect.left(), icon_top), tab_icon_size)
icon_rect = self._style.visualRect(opt.direction, opt.rect, icon_rect)
return icon_rect
diff --git a/qutebrowser/mainwindow/windowundo.py b/qutebrowser/mainwindow/windowundo.py
index 0104a8187..dcc244473 100644
--- a/qutebrowser/mainwindow/windowundo.py
+++ b/qutebrowser/mainwindow/windowundo.py
@@ -23,11 +23,11 @@ import collections
import dataclasses
from typing import MutableSequence, cast, TYPE_CHECKING
-from qutebrowser.qt.core import QObject, QByteArray
-
from qutebrowser.config import config
from qutebrowser.mainwindow import mainwindow
from qutebrowser.misc import objects
+from qutebrowser.qt import core
+
if TYPE_CHECKING:
from qutebrowser.mainwindow import tabbedbrowser
@@ -40,11 +40,11 @@ class _WindowUndoEntry:
"""Information needed for :undo -w."""
- geometry: QByteArray
+ geometry: core.QByteArray
tab_stack: 'tabbedbrowser.UndoStackType'
-class WindowUndoManager(QObject):
+class WindowUndoManager(core.QObject):
"""Manager which saves/restores windows."""
diff --git a/qutebrowser/misc/autoupdate.py b/qutebrowser/misc/autoupdate.py
index ca21181c0..d945c23a9 100644
--- a/qutebrowser/misc/autoupdate.py
+++ b/qutebrowser/misc/autoupdate.py
@@ -21,12 +21,11 @@
import json
-from qutebrowser.qt.core import pyqtSignal, pyqtSlot, QObject, QUrl
-
from qutebrowser.misc import httpclient
+from qutebrowser.qt import core
-class PyPIVersionClient(QObject):
+class PyPIVersionClient(core.QObject):
"""A client for the PyPI API using HTTPClient.
@@ -46,8 +45,8 @@ class PyPIVersionClient(QObject):
"""
API_URL = 'https://pypi.org/pypi/{}/json'
- success = pyqtSignal(str)
- error = pyqtSignal(str)
+ success = core.pyqtSignal(str)
+ error = core.pyqtSignal(str)
def __init__(self, parent=None, client=None):
super().__init__(parent)
@@ -66,10 +65,10 @@ class PyPIVersionClient(QObject):
Args:
package: The name of the package to check.
"""
- url = QUrl(self.API_URL.format(package))
+ url = core.QUrl(self.API_URL.format(package))
self._client.get(url)
- @pyqtSlot(str)
+ @core.pyqtSlot(str)
def on_client_success(self, data):
"""Process the data and finish when the client finished.
diff --git a/qutebrowser/misc/backendproblem.py b/qutebrowser/misc/backendproblem.py
index 4c0e184ac..40b15a9f5 100644
--- a/qutebrowser/misc/backendproblem.py
+++ b/qutebrowser/misc/backendproblem.py
@@ -29,10 +29,7 @@ import argparse
import dataclasses
from typing import Any, Optional, Sequence, Tuple
-from qutebrowser.qt.core import Qt
-from qutebrowser.qt.widgets import (QDialog, QPushButton, QHBoxLayout, QVBoxLayout, QLabel,
- QMessageBox, QWidget)
-from qutebrowser.qt.network import QSslSocket
+from qutebrowser.qt import widgets, network, core
from qutebrowser.config import config, configfiles
from qutebrowser.utils import (usertypes, version, qtutils, log, utils,
@@ -44,10 +41,10 @@ class _Result(enum.IntEnum):
"""The result code returned by the backend problem dialog."""
- quit = QDialog.DialogCode.Accepted + 1
- restart = QDialog.DialogCode.Accepted + 2
- restart_webkit = QDialog.DialogCode.Accepted + 3
- restart_webengine = QDialog.DialogCode.Accepted + 4
+ quit = widgets.QDialog.DialogCode.Accepted + 1
+ restart = widgets.QDialog.DialogCode.Accepted + 2
+ restart_webkit = widgets.QDialog.DialogCode.Accepted + 3
+ restart_webengine = widgets.QDialog.DialogCode.Accepted + 4
@dataclasses.dataclass
@@ -100,7 +97,7 @@ def _error_text(
return text
-class _Dialog(QDialog):
+class _Dialog(widgets.QDialog):
"""A dialog which gets shown if there are issues with the backend."""
@@ -109,22 +106,22 @@ class _Dialog(QDialog):
backend: usertypes.Backend,
suggest_other_backend: bool = True,
buttons: Sequence[_Button] = None,
- parent: QWidget = None) -> None:
+ parent: widgets.QWidget = None) -> None:
super().__init__(parent)
- vbox = QVBoxLayout(self)
+ vbox = widgets.QVBoxLayout(self)
text = _error_text(because, text, backend,
suggest_other_backend=suggest_other_backend)
- label = QLabel(text)
+ label = widgets.QLabel(text)
label.setWordWrap(True)
- label.setTextFormat(Qt.TextFormat.RichText)
+ label.setTextFormat(core.Qt.TextFormat.RichText)
vbox.addWidget(label)
- hbox = QHBoxLayout()
+ hbox = widgets.QHBoxLayout()
buttons = [] if buttons is None else buttons
- quit_button = QPushButton("Quit")
+ quit_button = widgets.QPushButton("Quit")
quit_button.clicked.connect(lambda: self.done(_Result.quit))
hbox.addWidget(quit_button)
@@ -133,13 +130,13 @@ class _Dialog(QDialog):
backend_text = "Force {} backend".format(other_backend.name)
if other_backend == usertypes.Backend.QtWebKit:
backend_text += ' (not recommended)'
- backend_button = QPushButton(backend_text)
+ backend_button = widgets.QPushButton(backend_text)
backend_button.clicked.connect(functools.partial(
self._change_setting, 'backend', other_setting))
hbox.addWidget(backend_button)
for button in buttons:
- btn = QPushButton(button.text)
+ btn = widgets.QPushButton(button.text)
btn.setDefault(button.default)
btn.clicked.connect(functools.partial(
self._change_setting, button.setting, button.value))
@@ -190,7 +187,7 @@ class _BackendProblemChecker:
status = dialog.exec()
self._save_manager.save_all(is_exit=True)
- if status in [_Result.quit, QDialog.DialogCode.Rejected]:
+ if status in [_Result.quit, widgets.QDialog.DialogCode.Rejected]:
pass
elif status == _Result.restart_webkit:
quitter.instance.restart(override_args={'backend': 'webkit'})
@@ -209,7 +206,7 @@ class _BackendProblemChecker:
results = _BackendImports()
try:
- from qutebrowser.qt import webkit, webkitwidgets
+ pass
except (ImportError, ValueError) as e:
results.webkit_error = str(e)
assert results.webkit_error
@@ -218,7 +215,7 @@ class _BackendProblemChecker:
results.webkit_error = "Unsupported legacy QtWebKit found"
try:
- from qutebrowser.qt import webenginecore, webenginewidgets
+ pass
except (ImportError, ValueError) as e:
results.webengine_error = str(e)
assert results.webengine_error
@@ -230,7 +227,7 @@ class _BackendProblemChecker:
If "fatal" is given, show an error and exit.
"""
- if QSslSocket.supportsSsl():
+ if network.QSslSocket.supportsSsl():
return
text = ("Could not initialize QtNetwork SSL support. This only "
@@ -240,7 +237,7 @@ class _BackendProblemChecker:
errbox = msgbox.msgbox(parent=None,
title="SSL error",
text="Could not initialize SSL support.",
- icon=QMessageBox.Icon.Critical,
+ icon=widgets.QMessageBox.Icon.Critical,
plain_text=False)
errbox.exec()
sys.exit(usertypes.Exit.err_init)
@@ -266,7 +263,7 @@ class _BackendProblemChecker:
errbox = msgbox.msgbox(parent=None,
title="No backend library found!",
text=text,
- icon=QMessageBox.Icon.Critical,
+ icon=widgets.QMessageBox.Icon.Critical,
plain_text=False)
errbox.exec()
sys.exit(usertypes.Exit.err_init)
@@ -357,12 +354,12 @@ class _BackendProblemChecker:
parent=None,
title="QtWebEngine version change",
text=text,
- icon=QMessageBox.Icon.Warning,
+ icon=widgets.QMessageBox.Icon.Warning,
plain_text=False,
- buttons=QMessageBox.StandardButton.Ok | QMessageBox.StandardButton.Abort,
+ buttons=widgets.QMessageBox.StandardButton.Ok | widgets.QMessageBox.StandardButton.Abort,
)
response = box.exec()
- if response != QMessageBox.StandardButton.Ok:
+ if response != widgets.QMessageBox.StandardButton.Ok:
sys.exit(usertypes.Exit.err_init)
def _check_webengine_version(self) -> None:
@@ -374,7 +371,7 @@ class _BackendProblemChecker:
errbox = msgbox.msgbox(parent=None,
title="QtWebEngine too old",
text=text,
- icon=QMessageBox.Icon.Critical,
+ icon=widgets.QMessageBox.Icon.Critical,
plain_text=False)
errbox.exec()
sys.exit(usertypes.Exit.err_init)
diff --git a/qutebrowser/misc/cmdhistory.py b/qutebrowser/misc/cmdhistory.py
index cd880a0fc..43b77ec2b 100644
--- a/qutebrowser/misc/cmdhistory.py
+++ b/qutebrowser/misc/cmdhistory.py
@@ -21,10 +21,9 @@
from typing import MutableSequence
-from qutebrowser.qt.core import pyqtSlot, pyqtSignal, QObject
-
from qutebrowser.utils import usertypes, log, standarddir, objreg
from qutebrowser.misc import lineparser
+from qutebrowser.qt import core
class HistoryEmptyError(Exception):
@@ -37,7 +36,7 @@ class HistoryEndReachedError(Exception):
"""Raised when the end of the history is reached."""
-class History(QObject):
+class History(core.QObject):
"""Command history.
@@ -49,7 +48,7 @@ class History(QObject):
changed: Emitted when an entry was added to the history.
"""
- changed = pyqtSignal()
+ changed = core.pyqtSignal()
def __init__(self, *, history=None, parent=None):
"""Constructor.
@@ -92,7 +91,7 @@ class History(QObject):
self._tmphist = usertypes.NeighborList(items)
return self._tmphist.lastitem()
- @pyqtSlot()
+ @core.pyqtSlot()
def stop(self):
"""Stop browsing the history."""
self._tmphist = None
diff --git a/qutebrowser/misc/consolewidget.py b/qutebrowser/misc/consolewidget.py
index b2c2b4571..3206dcfcd 100644
--- a/qutebrowser/misc/consolewidget.py
+++ b/qutebrowser/misc/consolewidget.py
@@ -22,14 +22,12 @@
import sys
import code
from typing import MutableSequence
-
-from qutebrowser.qt.core import pyqtSignal, pyqtSlot, Qt
-from qutebrowser.qt.widgets import QTextEdit, QWidget, QVBoxLayout, QApplication
-from qutebrowser.qt.gui import QTextCursor
+from qutebrowser.qt import widgets, gui
from qutebrowser.config import stylesheet
from qutebrowser.misc import cmdhistory, miscwidgets
from qutebrowser.utils import utils, objreg
+from qutebrowser.qt import core
console_widget = None
@@ -46,7 +44,7 @@ class ConsoleLineEdit(miscwidgets.CommandLineEdit):
execute: Emitted when a commandline should be executed.
"""
- execute = pyqtSignal(str)
+ execute = core.pyqtSignal(str)
def __init__(self, _namespace, parent):
"""Constructor.
@@ -58,7 +56,7 @@ class ConsoleLineEdit(miscwidgets.CommandLineEdit):
self._history = cmdhistory.History(parent=self)
self.returnPressed.connect(self.on_return_pressed)
- @pyqtSlot()
+ @core.pyqtSlot()
def on_return_pressed(self):
"""Execute the line of code which was entered."""
self._history.stop()
@@ -92,20 +90,20 @@ class ConsoleLineEdit(miscwidgets.CommandLineEdit):
def keyPressEvent(self, e):
"""Override keyPressEvent to handle special keypresses."""
- if e.key() == Qt.Key.Key_Up:
+ if e.key() == core.Qt.Key.Key_Up:
self.history_prev()
e.accept()
- elif e.key() == Qt.Key.Key_Down:
+ elif e.key() == core.Qt.Key.Key_Down:
self.history_next()
e.accept()
- elif e.modifiers() & Qt.KeyboardModifier.ControlModifier and e.key() == Qt.Key.Key_C:
+ elif e.modifiers() & core.Qt.KeyboardModifier.ControlModifier and e.key() == core.Qt.Key.Key_C:
self.setText('')
e.accept()
else:
super().keyPressEvent(e)
-class ConsoleTextEdit(QTextEdit):
+class ConsoleTextEdit(widgets.QTextEdit):
"""Custom QTextEdit for console output."""
@@ -113,7 +111,7 @@ class ConsoleTextEdit(QTextEdit):
super().__init__(parent)
self.setAcceptRichText(False)
self.setReadOnly(True)
- self.setFocusPolicy(Qt.FocusPolicy.ClickFocus)
+ self.setFocusPolicy(core.Qt.FocusPolicy.ClickFocus)
def __repr__(self):
return utils.get_repr(self)
@@ -124,13 +122,13 @@ class ConsoleTextEdit(QTextEdit):
We can't use Qt's way to append stuff because that inserts weird
newlines.
"""
- self.moveCursor(QTextCursor.MoveOperation.End)
+ self.moveCursor(gui.QTextCursor.MoveOperation.End)
self.insertPlainText(text)
scrollbar = self.verticalScrollBar()
scrollbar.setValue(scrollbar.maximum())
-class ConsoleWidget(QWidget):
+class ConsoleWidget(widgets.QWidget):
"""A widget with an interactive Python console.
@@ -158,7 +156,7 @@ class ConsoleWidget(QWidget):
namespace = {
'__name__': '__console__',
'__doc__': None,
- 'q_app': QApplication.instance(),
+ 'q_app': widgets.QApplication.instance(),
# We use parent as self here because the user "feels" the whole
# console, not just the line edit.
'self': parent,
@@ -170,7 +168,7 @@ class ConsoleWidget(QWidget):
self._lineedit.execute.connect(self.push)
self._output = ConsoleTextEdit()
self.write(self._curprompt())
- self._vbox = QVBoxLayout()
+ self._vbox = widgets.QVBoxLayout()
self._vbox.setSpacing(0)
self._vbox.addWidget(self._output)
self._vbox.addWidget(self._lineedit)
@@ -186,7 +184,7 @@ class ConsoleWidget(QWidget):
"""Write a line of text (without added newline) to the output."""
self._output.append_text(line)
- @pyqtSlot(str)
+ @core.pyqtSlot(str)
def push(self, line):
"""Push a line to the interpreter."""
self._buffer.append(line)
diff --git a/qutebrowser/misc/crashdialog.py b/qutebrowser/misc/crashdialog.py
index b3998cf27..23a9aa1e7 100644
--- a/qutebrowser/misc/crashdialog.py
+++ b/qutebrowser/misc/crashdialog.py
@@ -30,25 +30,21 @@ import datetime
import enum
from typing import List, Tuple
-from qutebrowser.qt.core import pyqtSlot, Qt, QSize
-from qutebrowser.qt.widgets import (QDialog, QLabel, QTextEdit, QPushButton,
- QVBoxLayout, QHBoxLayout, QCheckBox,
- QDialogButtonBox, QMessageBox)
-
import qutebrowser
from qutebrowser.utils import version, log, utils
from qutebrowser.misc import (miscwidgets, autoupdate, msgbox, httpclient,
pastebin, objects)
from qutebrowser.config import config, configfiles
from qutebrowser.browser import history
+from qutebrowser.qt import widgets, core
class Result(enum.IntEnum):
"""The result code returned by the crash dialog."""
- restore = QDialog.DialogCode.Accepted + 1
- no_restore = QDialog.DialogCode.Accepted + 2
+ restore = widgets.QDialog.DialogCode.Accepted + 1
+ no_restore = widgets.QDialog.DialogCode.Accepted + 2
def parse_fatal_stacktrace(text):
@@ -92,7 +88,7 @@ def _get_environment_vars():
return '\n'.join(sorted(info))
-class _CrashDialog(QDialog):
+class _CrashDialog(widgets.QDialog):
"""Dialog which gets shown after there was a crash.
@@ -122,8 +118,8 @@ class _CrashDialog(QDialog):
self._btn_box = None
self._paste_text = None
self.setWindowTitle("Whoops!")
- self.resize(QSize(640, 600))
- self._vbox = QVBoxLayout(self)
+ self.resize(core.QSize(640, 600))
+ self._vbox = widgets.QVBoxLayout(self)
http_client = httpclient.HTTPClient()
self._paste_client = pastebin.PastebinClient(http_client, self)
@@ -135,9 +131,9 @@ class _CrashDialog(QDialog):
self._init_contact_input()
- info = QLabel("What were you doing when this crash/bug happened?")
+ info = widgets.QLabel("What were you doing when this crash/bug happened?")
self._vbox.addWidget(info)
- self._info = QTextEdit()
+ self._info = widgets.QTextEdit()
self._info.setTabChangesFocus(True)
self._info.setAcceptRichText(False)
self._info.setPlaceholderText("- Opened http://www.example.com/\n"
@@ -146,10 +142,10 @@ class _CrashDialog(QDialog):
self._vbox.addWidget(self._info, 5)
self._vbox.addSpacing(15)
- self._debug_log = QTextEdit()
+ self._debug_log = widgets.QTextEdit()
self._debug_log.setTabChangesFocus(True)
self._debug_log.setAcceptRichText(False)
- self._debug_log.setLineWrapMode(QTextEdit.LineWrapMode.NoWrap)
+ self._debug_log.setLineWrapMode(widgets.QTextEdit.LineWrapMode.NoWrap)
self._debug_log.hide()
self._fold = miscwidgets.DetailFold("Show log", self)
self._fold.toggled.connect(self._debug_log.setVisible)
@@ -165,7 +161,7 @@ class _CrashDialog(QDialog):
def keyPressEvent(self, e):
"""Prevent closing :report dialogs when pressing <Escape>."""
- if config.val.input.escape_quits_reporter or e.key() != Qt.Key.Key_Escape:
+ if config.val.input.escape_quits_reporter or e.key() != core.Qt.Key.Key_Escape:
super().keyPressEvent(e)
def __repr__(self):
@@ -173,12 +169,12 @@ class _CrashDialog(QDialog):
def _init_contact_input(self):
"""Initialize the widget asking for contact info."""
- contact = QLabel("I'd like to be able to follow up with you, to keep "
+ contact = widgets.QLabel("I'd like to be able to follow up with you, to keep "
"you posted on the status of this crash and get more "
"information if I need it - how can I contact you?")
contact.setWordWrap(True)
self._vbox.addWidget(contact)
- self._contact = QTextEdit()
+ self._contact = widgets.QTextEdit()
self._contact.setTabChangesFocus(True)
self._contact.setAcceptRichText(False)
try:
@@ -198,10 +194,10 @@ class _CrashDialog(QDialog):
Should be extended by subclasses to set the actual text.
"""
- self._lbl = QLabel()
+ self._lbl = widgets.QLabel()
self._lbl.setWordWrap(True)
self._lbl.setOpenExternalLinks(True)
- self._lbl.setTextInteractionFlags(Qt.TextInteractionFlag.LinksAccessibleByMouse)
+ self._lbl.setTextInteractionFlags(core.Qt.TextInteractionFlag.LinksAccessibleByMouse)
self._vbox.addWidget(self._lbl)
def _init_checkboxes(self):
@@ -209,22 +205,22 @@ class _CrashDialog(QDialog):
def _init_buttons(self):
"""Initialize the buttons."""
- self._btn_box = QDialogButtonBox()
+ self._btn_box = widgets.QDialogButtonBox()
self._vbox.addWidget(self._btn_box)
- self._btn_report = QPushButton("Report")
+ self._btn_report = widgets.QPushButton("Report")
self._btn_report.setDefault(True)
self._btn_report.clicked.connect(self.on_report_clicked)
- self._btn_box.addButton(self._btn_report, QDialogButtonBox.ButtonRole.AcceptRole)
+ self._btn_box.addButton(self._btn_report, widgets.QDialogButtonBox.ButtonRole.AcceptRole)
- self._btn_cancel = QPushButton("Don't report")
+ self._btn_cancel = widgets.QPushButton("Don't report")
self._btn_cancel.setAutoDefault(False)
self._btn_cancel.clicked.connect(self.finish)
- self._btn_box.addButton(self._btn_cancel, QDialogButtonBox.ButtonRole.RejectRole)
+ self._btn_box.addButton(self._btn_cancel, widgets.QDialogButtonBox.ButtonRole.RejectRole)
def _init_info_text(self):
"""Add an info text encouraging the user to report crashes."""
- info_label = QLabel("<br/>There is currently a big backlog of crash "
+ info_label = widgets.QLabel("<br/>There is currently a big backlog of crash "
"reports. Thus, it might take a while until your "
"report is seen.<br/>A new tool allowing for more "
"automation will fix this, but is not ready yet "
@@ -326,7 +322,7 @@ class _CrashDialog(QDialog):
exc_text = '{}: {}'.format(e.__class__.__name__, e)
self.show_error(exc_text)
- @pyqtSlot()
+ @core.pyqtSlot()
def on_report_clicked(self):
"""Report and close dialog if report button was clicked."""
self._btn_report.setEnabled(False)
@@ -334,14 +330,14 @@ class _CrashDialog(QDialog):
self._btn_report.setText("Reporting...")
self.report()
- @pyqtSlot()
+ @core.pyqtSlot()
def on_paste_success(self):
"""Get the newest version from PyPI when the paste is done."""
self._pypi_client.success.connect(self.on_version_success)
self._pypi_client.error.connect(self.on_version_error)
self._pypi_client.get_version()
- @pyqtSlot(str)
+ @core.pyqtSlot(str)
def show_error(self, text):
"""Show a paste error dialog.
@@ -352,7 +348,7 @@ class _CrashDialog(QDialog):
error_dlg.finished.connect(self.finish)
error_dlg.show()
- @pyqtSlot(str)
+ @core.pyqtSlot(str)
def on_version_success(self, newest):
"""Called when the version was obtained from self._pypi_client.
@@ -370,7 +366,7 @@ class _CrashDialog(QDialog):
msgbox.information(self, "Report successfully sent!", text,
on_finished=self.finish, plain_text=False)
- @pyqtSlot(str)
+ @core.pyqtSlot(str)
def on_version_error(self, msg):
"""Called when the version was not obtained from self._pypi_client.
@@ -386,7 +382,7 @@ class _CrashDialog(QDialog):
msgbox.information(self, "Report successfully sent!", text,
on_finished=self.finish, plain_text=False)
- @pyqtSlot()
+ @core.pyqtSlot()
def finish(self):
"""Save contact info and close the dialog."""
self._save_contact_info()
@@ -421,10 +417,10 @@ class ExceptionCrashDialog(_CrashDialog):
def _init_checkboxes(self):
"""Add checkboxes to the dialog."""
super()._init_checkboxes()
- self._chk_restore = QCheckBox("Restore open pages")
+ self._chk_restore = widgets.QCheckBox("Restore open pages")
self._chk_restore.setChecked(True)
self._vbox.addWidget(self._chk_restore)
- self._chk_log = QCheckBox("Include a debug log in the report")
+ self._chk_log = widgets.QCheckBox("Include a debug log in the report")
self._chk_log.setChecked(True)
try:
if config.val.content.private_browsing:
@@ -433,7 +429,7 @@ class ExceptionCrashDialog(_CrashDialog):
log.misc.exception("Error while checking private browsing mode")
self._chk_log.toggled.connect(self._set_crash_info)
self._vbox.addWidget(self._chk_log)
- info_label = QLabel("This makes it a lot easier to diagnose the "
+ info_label = widgets.QLabel("This makes it a lot easier to diagnose the "
"crash.<br/><b>Note that the log might contain "
"sensitive information such as which pages you "
"visited or keyboard input.</b><br/>You can show "
@@ -468,7 +464,7 @@ class ExceptionCrashDialog(_CrashDialog):
except Exception:
self._crash_info.append(("Debug log", traceback.format_exc()))
- @pyqtSlot()
+ @core.pyqtSlot()
def finish(self):
self._save_contact_info()
if self._chk_restore.isChecked():
@@ -492,7 +488,7 @@ class FatalCrashDialog(_CrashDialog):
def __init__(self, debug, text, parent=None):
super().__init__(debug, parent)
self._log = text
- self.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose)
+ self.setAttribute(core.Qt.WidgetAttribute.WA_DeleteOnClose)
self._set_crash_info()
self._type, self._func = parse_fatal_stacktrace(self._log)
@@ -519,7 +515,7 @@ class FatalCrashDialog(_CrashDialog):
def _init_checkboxes(self):
"""Add checkboxes to the dialog."""
super()._init_checkboxes()
- self._chk_history = QCheckBox("Include a history of the last "
+ self._chk_history = widgets.QCheckBox("Include a history of the last "
"accessed pages in the report.")
self._chk_history.setChecked(True)
try:
@@ -544,7 +540,7 @@ class FatalCrashDialog(_CrashDialog):
history_data = traceback.format_exc()
self._crash_info.append(("History", history_data))
- @pyqtSlot()
+ @core.pyqtSlot()
def on_report_clicked(self):
"""Prevent empty reports."""
if (not self._info.toPlainText().strip() and
@@ -557,7 +553,7 @@ class FatalCrashDialog(_CrashDialog):
"spend on developing qutebrowser instead.\n\nPlease "
"help making qutebrowser better by providing more "
"information, or don't report this.",
- icon=QMessageBox.Icon.Critical)
+ icon=widgets.QMessageBox.Icon.Critical)
else:
super().on_report_clicked()
@@ -574,7 +570,7 @@ class ReportDialog(_CrashDialog):
def __init__(self, pages, cmdhist, qobjects, parent=None):
super().__init__(False, parent)
- self.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose)
+ self.setAttribute(core.Qt.WidgetAttribute.WA_DeleteOnClose)
self._pages = pages
self._cmdhist = cmdhist
self._qobjects = qobjects
@@ -608,21 +604,21 @@ class ReportDialog(_CrashDialog):
self._crash_info.append(("Debug log", traceback.format_exc()))
-class ReportErrorDialog(QDialog):
+class ReportErrorDialog(widgets.QDialog):
"""An error dialog shown on unsuccessful reports."""
def __init__(self, exc_text, text, parent=None):
super().__init__(parent)
- vbox = QVBoxLayout(self)
- label = QLabel("<b>There was an error while reporting the crash</b>:"
+ vbox = widgets.QVBoxLayout(self)
+ label = widgets.QLabel("<b>There was an error while reporting the crash</b>:"
"<br/>{}<br/><br/>"
"Please copy the text below and send a mail to "
"<a href='mailto:crash@qutebrowser.org'>"
"crash@qutebrowser.org</a> - Thanks!".format(
html.escape(exc_text)))
vbox.addWidget(label)
- txt = QTextEdit()
+ txt = widgets.QTextEdit()
txt.setReadOnly(True)
txt.setTabChangesFocus(True)
txt.setAcceptRichText(False)
@@ -630,9 +626,9 @@ class ReportErrorDialog(QDialog):
txt.selectAll()
vbox.addWidget(txt)
- hbox = QHBoxLayout()
+ hbox = widgets.QHBoxLayout()
hbox.addStretch()
- btn = QPushButton("Close")
+ btn = widgets.QPushButton("Close")
btn.clicked.connect(self.close)
hbox.addWidget(btn)
vbox.addLayout(hbox)
diff --git a/qutebrowser/misc/crashsignal.py b/qutebrowser/misc/crashsignal.py
index a0144e26d..942655d86 100644
--- a/qutebrowser/misc/crashsignal.py
+++ b/qutebrowser/misc/crashsignal.py
@@ -31,15 +31,12 @@ import threading
import faulthandler
import dataclasses
from typing import TYPE_CHECKING, Optional, MutableMapping, cast, List
-
-from qutebrowser.qt.core import (pyqtSlot, qInstallMessageHandler, QObject,
- QSocketNotifier, QTimer, QUrl)
-from qutebrowser.qt.widgets import QApplication
+from qutebrowser.qt import widgets
from qutebrowser.api import cmdutils
from qutebrowser.misc import earlyinit, crashdialog, ipc, objects
from qutebrowser.utils import usertypes, standarddir, log, objreg, debug, utils
-from qutebrowser.qt import sip
+from qutebrowser.qt import core, sip
if TYPE_CHECKING:
from qutebrowser.misc import quitter
@@ -57,7 +54,7 @@ class ExceptionInfo:
crash_handler = cast('CrashHandler', None)
-class CrashHandler(QObject):
+class CrashHandler(core.QObject):
"""Handler for crashes, reports and exceptions.
@@ -135,7 +132,7 @@ class CrashHandler(QObject):
for tab in tabbed_browser.widgets():
try:
urlstr = tab.url().toString(
- QUrl.UrlFormattingOption.RemovePassword | QUrl.ComponentFormattingOption.FullyEncoded)
+ core.QUrl.UrlFormattingOption.RemovePassword | core.QUrl.ComponentFormattingOption.FullyEncoded)
if urlstr:
win_pages.append(urlstr)
except Exception:
@@ -178,7 +175,7 @@ class CrashHandler(QObject):
else:
self._crash_dialog.report(info=info, contact=contact)
- @pyqtSlot()
+ @core.pyqtSlot()
def shutdown(self):
self.destroy_crashlogfile()
@@ -303,7 +300,7 @@ class CrashHandler(QObject):
# We might risk a segfault here, but that's better than continuing to
# run in some undefined state, so we only do the most needed shutdown
# here.
- qInstallMessageHandler(None)
+ core.qInstallMessageHandler(None)
self.destroy_crashlogfile()
sys.exit(usertypes.Exit.exception)
@@ -313,7 +310,7 @@ class CrashHandler(QObject):
self._crash_dialog.raise_()
-class SignalHandler(QObject):
+class SignalHandler(core.QObject):
"""Handler responsible for handling OS signals (SIGINT, SIGTERM, etc.).
@@ -358,8 +355,8 @@ class SignalHandler(QObject):
for fd in [read_fd, write_fd]:
flags = fcntl.fcntl(fd, fcntl.F_GETFL)
fcntl.fcntl(fd, fcntl.F_SETFL, flags | os.O_NONBLOCK)
- self._notifier = QSocketNotifier(cast(sip.voidptr, read_fd),
- QSocketNotifier.Type.Read,
+ self._notifier = core.QSocketNotifier(cast(sip.voidptr, read_fd),
+ core.QSocketNotifier.Type.Read,
self)
self._notifier.activated.connect(self.handle_signal_wakeup)
self._orig_wakeup_fd = signal.set_wakeup_fd(write_fd)
@@ -385,7 +382,7 @@ class SignalHandler(QObject):
self._timer.stop()
self._activated = False
- @pyqtSlot()
+ @core.pyqtSlot()
def handle_signal_wakeup(self):
"""Handle a newly arrived signal.
@@ -406,7 +403,7 @@ class SignalHandler(QObject):
def _log_later(self, *lines):
"""Log the given text line-wise with a QTimer."""
for line in lines:
- QTimer.singleShot(0, functools.partial(log.destroy.info, line))
+ core.QTimer.singleShot(0, functools.partial(log.destroy.info, line))
def interrupt(self, signum, _frame):
"""Handler for signals to gracefully shutdown (SIGINT/SIGTERM).
@@ -419,7 +416,7 @@ class SignalHandler(QObject):
# Signals can arrive anywhere, so we do this in the main thread
self._log_later("SIGINT/SIGTERM received, shutting down!",
"Do the same again to forcefully quit.")
- QTimer.singleShot(0, functools.partial(
+ core.QTimer.singleShot(0, functools.partial(
self._quitter.shutdown, 128 + signum))
def interrupt_forcefully(self, signum, _frame):
@@ -434,7 +431,7 @@ class SignalHandler(QObject):
# Signals can arrive anywhere, so we do this in the main thread
self._log_later("Forceful quit requested, goodbye cruel world!",
"Do the same again to quit with even more force.")
- QTimer.singleShot(0, functools.partial(self._app.exit, 128 + signum))
+ core.QTimer.singleShot(0, functools.partial(self._app.exit, 128 + signum))
def interrupt_really_forcefully(self, signum, _frame):
"""Interrupt with even more force on the third SIGINT/SIGTERM request.
@@ -446,7 +443,7 @@ class SignalHandler(QObject):
sys.exit(128 + signum)
-def init(q_app: QApplication,
+def init(q_app: widgets.QApplication,
args: argparse.Namespace,
quitter: 'quitter.Quitter') -> None:
"""Initialize crash/signal handlers."""
diff --git a/qutebrowser/misc/earlyinit.py b/qutebrowser/misc/earlyinit.py
index 39db7b710..74c830dd9 100644
--- a/qutebrowser/misc/earlyinit.py
+++ b/qutebrowser/misc/earlyinit.py
@@ -78,22 +78,21 @@ def _die(message, exception=None):
message: The message to display.
exception: The exception object if we're handling an exception.
"""
- from qutebrowser.qt.widgets import QApplication, QMessageBox
- from qutebrowser.qt.core import Qt
+ from qutebrowser.qt import widgets, network, core
if (('--debug' in sys.argv or '--no-err-windows' in sys.argv) and
exception is not None):
print(file=sys.stderr)
traceback.print_exc()
- app = QApplication(sys.argv)
+ app = widgets.QApplication(sys.argv)
if '--no-err-windows' in sys.argv:
print(message, file=sys.stderr)
print("Exiting because of --no-err-windows.", file=sys.stderr)
else:
if exception is not None:
message = message.replace('%ERROR%', str(exception))
- msgbox = QMessageBox(QMessageBox.Icon.Critical, "qutebrowser: Fatal error!",
+ msgbox = widgets.QMessageBox(widgets.QMessageBox.Icon.Critical, "qutebrowser: Fatal error!",
message)
- msgbox.setTextFormat(Qt.TextFormat.RichText)
+ msgbox.setTextFormat(core.Qt.TextFormat.RichText)
msgbox.resize(msgbox.sizeHint())
msgbox.exec()
app.quit()
@@ -165,11 +164,9 @@ def check_pyqt():
def qt_version(qversion=None, qt_version_str=None):
"""Get a Qt version string based on the runtime/compiled versions."""
if qversion is None:
- from qutebrowser.qt.core import qVersion
- qversion = qVersion()
+ qversion = core.qVersion()
if qt_version_str is None:
- from qutebrowser.qt.core import QT_VERSION_STR
- qt_version_str = QT_VERSION_STR
+ qt_version_str = core.QT_VERSION_STR
if qversion != qt_version_str:
return '{} (compiled {})'.format(qversion, qt_version_str)
@@ -179,31 +176,29 @@ def qt_version(qversion=None, qt_version_str=None):
def check_qt_version():
"""Check if the Qt version is recent enough."""
- from qutebrowser.qt.core import QT_VERSION, PYQT_VERSION, PYQT_VERSION_STR
try:
- from qutebrowser.qt.core import QVersionNumber, QLibraryInfo
- qt_ver = QLibraryInfo.version().normalized()
- recent_qt_runtime = qt_ver >= QVersionNumber(5, 15) # type: ignore[operator]
+ qt_ver = core.QLibraryInfo.version().normalized()
+ recent_qt_runtime = qt_ver >= core.QVersionNumber(5, 15) # type: ignore[operator]
except (ImportError, AttributeError):
# QVersionNumber was added in Qt 5.6, QLibraryInfo.version() in 5.8
recent_qt_runtime = False
- if QT_VERSION < 0x050F00 or PYQT_VERSION < 0x050F00 or not recent_qt_runtime:
+ if core.QT_VERSION < 0x050F00 or core.PYQT_VERSION < 0x050F00 or not recent_qt_runtime:
text = ("Fatal error: Qt >= 5.15.0 and PyQt >= 5.15.0 are required, "
"but Qt {} / PyQt {} is installed.".format(qt_version(),
- PYQT_VERSION_STR))
+ core.PYQT_VERSION_STR))
_die(text)
- if 0x060000 <= PYQT_VERSION < 0x060202:
+ if 0x060000 <= core.PYQT_VERSION < 0x060202:
text = ("Fatal error: With Qt 6, PyQt >= 6.2.2 is required, but "
- "{} is installed.".format(PYQT_VERSION_STR))
+ "{} is installed.".format(core.PYQT_VERSION_STR))
_die(text)
def check_ssl_support():
"""Check if SSL support is available."""
try:
- from qutebrowser.qt.network import QSslSocket # pylint: disable=unused-import
+ pass
except ImportError:
_die("Fatal error: Your Qt is built without SSL support.")
@@ -255,8 +250,7 @@ def configure_pyqt():
Doing this means we can't use the interactive shell anymore (which we don't
anyways), but we can use pdb instead.
"""
- from qutebrowser.qt.core import pyqtRemoveInputHook
- pyqtRemoveInputHook()
+ core.pyqtRemoveInputHook()
from qutebrowser.qt import sip
try:
@@ -296,7 +290,7 @@ def webengine_early_import():
error messages in backendproblem.py are accurate.
"""
try:
- from qutebrowser.qt import webenginewidgets # pylint: disable=unused-import
+ pass
except ImportError:
pass
diff --git a/qutebrowser/misc/editor.py b/qutebrowser/misc/editor.py
index 1c4c6ca03..03ecd6368 100644
--- a/qutebrowser/misc/editor.py
+++ b/qutebrowser/misc/editor.py
@@ -22,16 +22,13 @@
import os
import tempfile
-from qutebrowser.qt.core import (pyqtSignal, pyqtSlot, QObject, QProcess,
- QFileSystemWatcher)
-
from qutebrowser.config import config
from qutebrowser.utils import message, log
from qutebrowser.misc import guiprocess
-from qutebrowser.qt import sip
+from qutebrowser.qt import core, sip
-class ExternalEditor(QObject):
+class ExternalEditor(core.QObject):
"""Class to simplify editing a text in an external editor.
@@ -51,15 +48,15 @@ class ExternalEditor(QObject):
editing_finished: The editor process was closed.
"""
- file_updated = pyqtSignal(str)
- editing_finished = pyqtSignal()
+ file_updated = core.pyqtSignal(str)
+ editing_finished = core.pyqtSignal()
def __init__(self, parent=None, watch=False):
super().__init__(parent)
self._filename = None
self._proc = None
self._remove_file = None
- self._watcher = QFileSystemWatcher(parent=self) if watch else None
+ self._watcher = core.QFileSystemWatcher(parent=self) if watch else None
self._content = None
def _cleanup(self, *, successful):
@@ -94,7 +91,7 @@ class ExternalEditor(QObject):
message.info(f"Keeping file {self._filename} as the editor process exited "
"abnormally")
- @pyqtSlot(int, QProcess.ExitStatus)
+ @core.pyqtSlot(int, core.QProcess.ExitStatus)
def _on_proc_closed(self, _exitcode, exitstatus):
"""Write the editor text into the form field and clean up tempfile.
@@ -105,7 +102,7 @@ class ExternalEditor(QObject):
return
log.procs.debug("Editor closed")
- if exitstatus != QProcess.ExitStatus.NormalExit:
+ if exitstatus != core.QProcess.ExitStatus.NormalExit:
# No error/cleanup here, since we already handle this in
# on_proc_error.
return
@@ -116,7 +113,7 @@ class ExternalEditor(QObject):
self.editing_finished.emit()
self._cleanup(successful=self._proc.outcome.was_successful())
- @pyqtSlot(QProcess.ProcessError)
+ @core.pyqtSlot(core.QProcess.ProcessError)
def _on_proc_error(self, _err):
self._cleanup(successful=False)
@@ -164,7 +161,7 @@ class ExternalEditor(QObject):
fobj.write(text)
return fobj.name
- @pyqtSlot(str)
+ @core.pyqtSlot(str)
def _on_file_changed(self, path):
try:
with open(path, 'r', encoding=config.val.editor.encoding) as f:
diff --git a/qutebrowser/misc/guiprocess.py b/qutebrowser/misc/guiprocess.py
index 8fcfb2803..154bca024 100644
--- a/qutebrowser/misc/guiprocess.py
+++ b/qutebrowser/misc/guiprocess.py
@@ -25,12 +25,10 @@ import shlex
import shutil
from typing import Mapping, Sequence, Dict, Optional
-from qutebrowser.qt.core import (pyqtSlot, pyqtSignal, QObject, QProcess,
- QProcessEnvironment, QByteArray, QUrl, Qt)
-
from qutebrowser.utils import message, log, utils, usertypes, version
from qutebrowser.api import cmdutils, apitypes
from qutebrowser.completion.models import miscmodels
+from qutebrowser.qt import core
all_processes: Dict[int, Optional['GUIProcess']] = {}
@@ -68,7 +66,7 @@ def process(tab: apitypes.Tab, pid: int = None, action: str = 'show') -> None:
raise cmdutils.CommandError(f"Data for process {pid} got cleaned up")
if action == 'show':
- tab.load_url(QUrl(f'qute://process/{pid}'))
+ tab.load_url(core.QUrl(f'qute://process/{pid}'))
elif action == 'terminate':
proc.terminate()
elif action == 'kill':
@@ -84,7 +82,7 @@ class ProcessOutcome:
what: str
running: bool = False
- status: Optional[QProcess.ExitStatus] = None
+ status: Optional[core.QProcess.ExitStatus] = None
code: Optional[int] = None
def was_successful(self) -> bool:
@@ -94,7 +92,7 @@ class ProcessOutcome:
"""
assert self.status is not None, "Process didn't finish yet"
assert self.code is not None
- return self.status == QProcess.ExitStatus.NormalExit and self.code == 0
+ return self.status == core.QProcess.ExitStatus.NormalExit and self.code == 0
def __str__(self) -> str:
if self.running:
@@ -105,12 +103,12 @@ class ProcessOutcome:
assert self.status is not None
assert self.code is not None
- if self.status == QProcess.ExitStatus.CrashExit:
+ if self.status == core.QProcess.ExitStatus.CrashExit:
return f"{self.what.capitalize()} crashed."
elif self.was_successful():
return f"{self.what.capitalize()} exited successfully."
- assert self.status == QProcess.ExitStatus.NormalExit
+ assert self.status == core.QProcess.ExitStatus.NormalExit
# We call this 'status' here as it makes more sense to the user -
# it's actually 'code'.
return f"{self.what.capitalize()} exited with status {self.code}."
@@ -124,7 +122,7 @@ class ProcessOutcome:
return 'running'
elif self.status is None:
return 'not started'
- elif self.status == QProcess.ExitStatus.CrashExit:
+ elif self.status == core.QProcess.ExitStatus.CrashExit:
return 'crashed'
elif self.was_successful():
return 'successful'
@@ -132,7 +130,7 @@ class ProcessOutcome:
return 'unsuccessful'
-class GUIProcess(QObject):
+class GUIProcess(core.QObject):
"""An external process which shows notifications in the GUI.
@@ -150,9 +148,9 @@ class GUIProcess(QObject):
error/finished/started signals proxied from QProcess.
"""
- error = pyqtSignal(QProcess.ProcessError)
- finished = pyqtSignal(int, QProcess.ExitStatus)
- started = pyqtSignal()
+ error = core.pyqtSignal(core.QProcess.ProcessError)
+ finished = core.pyqtSignal(int, core.QProcess.ExitStatus)
+ started = core.pyqtSignal()
def __init__(
self,
@@ -161,7 +159,7 @@ class GUIProcess(QObject):
verbose: bool = False,
additional_env: Mapping[str, str] = None,
output_messages: bool = False,
- parent: QObject = None,
+ parent: core.QObject = None,
):
super().__init__(parent)
self.what = what
@@ -177,12 +175,12 @@ class GUIProcess(QObject):
self.stderr: str = ""
self._cleanup_timer = usertypes.Timer(self, 'process-cleanup')
- self._cleanup_timer.setTimerType(Qt.TimerType.VeryCoarseTimer)
+ self._cleanup_timer.setTimerType(core.Qt.TimerType.VeryCoarseTimer)
self._cleanup_timer.setInterval(3600 * 1000) # 1h
self._cleanup_timer.timeout.connect(self._on_cleanup_timer)
self._cleanup_timer.setSingleShot(True)
- self._proc = QProcess(self)
+ self._proc = core.QProcess(self)
self._proc.errorOccurred.connect(self._on_error)
self._proc.errorOccurred.connect(self.error)
self._proc.finished.connect(self._on_finished)
@@ -193,7 +191,7 @@ class GUIProcess(QObject):
self._proc.readyReadStandardError.connect(self._on_ready_read_stderr)
if additional_env is not None:
- procenv = QProcessEnvironment.systemEnvironment()
+ procenv = core.QProcessEnvironment.systemEnvironment()
for k, v in additional_env.items():
procenv.insert(k, v)
self._proc.setProcessEnvironment(procenv)
@@ -203,12 +201,12 @@ class GUIProcess(QObject):
return f'<unknown {self.what} command>'
return ' '.join(shlex.quote(e) for e in [self.cmd] + list(self.args))
- def _decode_data(self, qba: QByteArray) -> str:
+ def _decode_data(self, qba: core.QByteArray) -> str:
"""Decode data coming from a process."""
encoding = locale.getpreferredencoding(do_setlocale=False)
return qba.data().decode(encoding, 'replace')
- def _process_text(self, data: QByteArray, attr: str) -> None:
+ def _process_text(self, data: core.QByteArray, attr: str) -> None:
"""Process new stdout/stderr text.
Arguments:
@@ -236,7 +234,7 @@ class GUIProcess(QObject):
else:
raise utils.Unreachable(attr)
- @pyqtSlot()
+ @core.pyqtSlot()
def _on_ready_read_stdout(self) -> None:
if not self._output_messages:
return
@@ -244,27 +242,27 @@ class GUIProcess(QObject):
self._process_text(self._proc.readAllStandardOutput(), 'stdout')
message.info(self._elide_output(self.stdout), replace=f"stdout-{self.pid}")
- @pyqtSlot()
+ @core.pyqtSlot()
def _on_ready_read_stderr(self) -> None:
if not self._output_messages:
return
self._process_text(self._proc.readAllStandardError(), 'stderr')
message.error(self._elide_output(self.stderr), replace=f"stderr-{self.pid}")
- @pyqtSlot(QProcess.ProcessError)
- def _on_error(self, error: QProcess.ProcessError) -> None:
+ @core.pyqtSlot(core.QProcess.ProcessError)
+ def _on_error(self, error: core.QProcess.ProcessError) -> None:
"""Show a message if there was an error while spawning."""
- if error == QProcess.ProcessError.Crashed and not utils.is_windows:
+ if error == core.QProcess.ProcessError.Crashed and not utils.is_windows:
# Already handled via ExitStatus in _on_finished
return
what = f"{self.what} {self.cmd!r}"
error_descriptions = {
- QProcess.ProcessError.FailedToStart: f"{what.capitalize()} failed to start",
- QProcess.ProcessError.Crashed: f"{what.capitalize()} crashed",
- QProcess.ProcessError.Timedout: f"{what.capitalize()} timed out",
- QProcess.ProcessError.WriteError: f"Write error for {what}",
- QProcess.ProcessError.ReadError: f"Read error for {what}",
+ core.QProcess.ProcessError.FailedToStart: f"{what.capitalize()} failed to start",
+ core.QProcess.ProcessError.Crashed: f"{what.capitalize()} crashed",
+ core.QProcess.ProcessError.Timedout: f"{what.capitalize()} timed out",
+ core.QProcess.ProcessError.WriteError: f"Write error for {what}",
+ core.QProcess.ProcessError.ReadError: f"Read error for {what}",
}
error_string = self._proc.errorString()
msg = ': '.join([error_descriptions[error], error_string])
@@ -295,8 +293,8 @@ class GUIProcess(QObject):
return output
- @pyqtSlot(int, QProcess.ExitStatus)
- def _on_finished(self, code: int, status: QProcess.ExitStatus) -> None:
+ @core.pyqtSlot(int, core.QProcess.ExitStatus)
+ def _on_finished(self, code: int, status: core.QProcess.ExitStatus) -> None:
"""Show a message when the process finished."""
log.procs.debug("Process finished with code {}, status {}.".format(
code, status))
@@ -327,7 +325,7 @@ class GUIProcess(QObject):
log.procs.error("Process stderr:\n" + self.stderr.strip())
message.error(str(self.outcome) + " See :process for details.")
- @pyqtSlot()
+ @core.pyqtSlot()
def _on_started(self) -> None:
"""Called when the process started successfully."""
log.procs.debug("Process started.")
@@ -394,7 +392,7 @@ class GUIProcess(QObject):
global last_pid
last_pid = self.pid
- @pyqtSlot()
+ @core.pyqtSlot()
def _on_cleanup_timer(self) -> None:
"""Remove the process from all registered processes."""
log.procs.debug(f"Cleaning up data for {self.pid}")
diff --git a/qutebrowser/misc/httpclient.py b/qutebrowser/misc/httpclient.py
index da205ae50..65652b385 100644
--- a/qutebrowser/misc/httpclient.py
+++ b/qutebrowser/misc/httpclient.py
@@ -23,23 +23,20 @@ import functools
import urllib.parse
from typing import MutableMapping
-from qutebrowser.qt.core import pyqtSignal, QObject, QTimer
-from qutebrowser.qt.network import (QNetworkAccessManager, QNetworkRequest,
- QNetworkReply)
-
from qutebrowser.utils import log
+from qutebrowser.qt import network, core
-class HTTPRequest(QNetworkRequest):
+class HTTPRequest(network.QNetworkRequest):
"""A QNetworkRquest that follows (secure) redirects by default."""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
- self.setAttribute(QNetworkRequest.Attribute.RedirectPolicyAttribute,
- QNetworkRequest.RedirectPolicy.NoLessSafeRedirectPolicy)
+ self.setAttribute(network.QNetworkRequest.Attribute.RedirectPolicyAttribute,
+ network.QNetworkRequest.RedirectPolicy.NoLessSafeRedirectPolicy)
-class HTTPClient(QObject):
+class HTTPClient(core.QObject):
"""An HTTP client based on QNetworkAccessManager.
@@ -56,16 +53,16 @@ class HTTPClient(QObject):
arg: The error message, as string.
"""
- success = pyqtSignal(str)
- error = pyqtSignal(str)
+ success = core.pyqtSignal(str)
+ error = core.pyqtSignal(str)
def __init__(self, parent=None):
super().__init__(parent)
with log.disable_qt_msghandler():
# WORKAROUND for a hang when messages are printed, see our
# NetworkAccessManager subclass for details.
- self._nam = QNetworkAccessManager(self)
- self._timers: MutableMapping[QNetworkReply, QTimer] = {}
+ self._nam = network.QNetworkAccessManager(self)
+ self._timers: MutableMapping[network.QNetworkReply, core.QTimer] = {}
def post(self, url, data=None):
"""Create a new POST request.
@@ -78,7 +75,7 @@ class HTTPClient(QObject):
data = {}
encoded_data = urllib.parse.urlencode(data).encode('utf-8')
request = HTTPRequest(url)
- request.setHeader(QNetworkRequest.KnownHeaders.ContentTypeHeader,
+ request.setHeader(network.QNetworkRequest.KnownHeaders.ContentTypeHeader,
'application/x-www-form-urlencoded;charset=utf-8')
reply = self._nam.post(request, encoded_data)
self._handle_reply(reply)
@@ -100,7 +97,7 @@ class HTTPClient(QObject):
if reply.isFinished():
self.on_reply_finished(reply)
else:
- timer = QTimer(self)
+ timer = core.QTimer(self)
timer.setInterval(10000)
timer.timeout.connect(reply.abort)
timer.start()
@@ -118,7 +115,7 @@ class HTTPClient(QObject):
if timer is not None:
timer.stop()
timer.deleteLater()
- if reply.error() != QNetworkReply.NetworkError.NoError:
+ if reply.error() != network.QNetworkReply.NetworkError.NoError:
self.error.emit(reply.errorString())
return
try:
diff --git a/qutebrowser/misc/ipc.py b/qutebrowser/misc/ipc.py
index c94c67b29..e756b929e 100644
--- a/qutebrowser/misc/ipc.py
+++ b/qutebrowser/misc/ipc.py
@@ -26,12 +26,9 @@ import getpass
import binascii
import hashlib
-from qutebrowser.qt.core import pyqtSignal, pyqtSlot, QObject, Qt
-from qutebrowser.qt.network import QLocalSocket, QLocalServer, QAbstractSocket
-
import qutebrowser
from qutebrowser.utils import log, usertypes, error, standarddir, utils, debug
-from qutebrowser.qt import sip
+from qutebrowser.qt import network, core, sip
CONNECT_TIMEOUT = 100 # timeout for connecting/disconnecting
@@ -107,12 +104,12 @@ class SocketError(Error):
"""
super().__init__()
self.action = action
- self.code: QLocalSocket.LocalSocketError = socket.error()
+ self.code: network.QLocalSocket.LocalSocketError = socket.error()
self.message: str = socket.errorString()
def __str__(self):
return "Error while {}: {} ({})".format(
- self.action, self.message, debug.qenum_key(QLocalSocket, self.code))
+ self.action, self.message, debug.qenum_key(network.QLocalSocket, self.code))
class ListenError(Error):
@@ -131,12 +128,12 @@ class ListenError(Error):
local_server: The QLocalServer which has the error set.
"""
super().__init__()
- self.code: QAbstractSocket.SocketError = local_server.serverError()
+ self.code: network.QAbstractSocket.SocketError = local_server.serverError()
self.message: str = local_server.errorString()
def __str__(self):
return "Error while listening to IPC server: {} ({})".format(
- self.message, debug.qenum_key(QAbstractSocket, self.code))
+ self.message, debug.qenum_key(network.QAbstractSocket, self.code))
class AddressInUseError(ListenError):
@@ -144,7 +141,7 @@ class AddressInUseError(ListenError):
"""Emitted when the server address is already in use."""
-class IPCServer(QObject):
+class IPCServer(core.QObject):
"""IPC server to which clients connect to.
@@ -163,9 +160,9 @@ class IPCServer(QObject):
got_invalid_data: Emitted when there was invalid incoming data.
"""
- got_args = pyqtSignal(list, str, str)
- got_raw = pyqtSignal(bytes)
- got_invalid_data = pyqtSignal()
+ got_args = core.pyqtSignal(list, str, str)
+ got_raw = core.pyqtSignal(bytes)
+ got_invalid_data = core.pyqtSignal()
def __init__(self, socketname, parent=None):
"""Start the IPC server and listen to commands.
@@ -188,9 +185,9 @@ class IPCServer(QObject):
self._atime_timer = usertypes.Timer(self, 'ipc-atime')
self._atime_timer.setInterval(ATIME_INTERVAL)
self._atime_timer.timeout.connect(self.update_atime)
- self._atime_timer.setTimerType(Qt.TimerType.VeryCoarseTimer)
+ self._atime_timer.setTimerType(core.Qt.TimerType.VeryCoarseTimer)
- self._server = QLocalServer(self)
+ self._server = network.QLocalServer(self)
self._server.newConnection.connect(self.handle_connection)
self._socket = None
@@ -204,13 +201,13 @@ class IPCServer(QObject):
# Thus, we only do so on Windows, and handle permissions manually in
# listen() on Linux.
log.ipc.debug("Calling setSocketOptions")
- self._server.setSocketOptions(QLocalServer.SocketOption.UserAccessOption)
+ self._server.setSocketOptions(network.QLocalServer.SocketOption.UserAccessOption)
else: # pragma: no cover
log.ipc.debug("Not calling setSocketOptions")
def _remove_server(self):
"""Remove an existing server."""
- ok = QLocalServer.removeServer(self._socketname)
+ ok = network.QLocalServer.removeServer(self._socketname)
if not ok:
raise Error("Error while removing server {}!".format(
self._socketname))
@@ -223,7 +220,7 @@ class IPCServer(QObject):
self._remove_server()
ok = self._server.listen(self._socketname)
if not ok:
- if self._server.serverError() == QAbstractSocket.SocketError.AddressInUseError:
+ if self._server.serverError() == network.QAbstractSocket.SocketError.AddressInUseError:
raise AddressInUseError(self._server)
raise ListenError(self._server)
@@ -237,7 +234,7 @@ class IPCServer(QObject):
# True, so report this as an error.
raise ListenError(self._server)
- @pyqtSlot('QLocalSocket::LocalSocketError')
+ @core.pyqtSlot('QLocalSocket::LocalSocketError')
def on_error(self, err):
"""Raise SocketError on fatal errors."""
if self._socket is None:
@@ -248,10 +245,10 @@ class IPCServer(QObject):
log.ipc.debug("Socket 0x{:x}: error {}: {}".format(
id(self._socket), self._socket.error(),
self._socket.errorString()))
- if err != QLocalSocket.LocalSocketError.PeerClosedError:
+ if err != network.QLocalSocket.LocalSocketError.PeerClosedError:
raise SocketError("handling IPC connection", self._socket)
- @pyqtSlot()
+ @core.pyqtSlot()
def handle_connection(self):
"""Handle a new connection to the server."""
if self.ignored:
@@ -277,17 +274,17 @@ class IPCServer(QObject):
socket.errorOccurred.connect(self.on_error)
if socket.error() not in [ # type: ignore[operator]
- QLocalSocket.LocalSocketError.UnknownSocketError,
- QLocalSocket.LocalSocketError.PeerClosedError
+ network.QLocalSocket.LocalSocketError.UnknownSocketError,
+ network.QLocalSocket.LocalSocketError.PeerClosedError
]:
log.ipc.debug("We got an error immediately.")
self.on_error(socket.error()) # type: ignore[operator]
socket.disconnected.connect(self.on_disconnected)
- if socket.state() == QLocalSocket.LocalSocketState.UnconnectedState:
+ if socket.state() == network.QLocalSocket.LocalSocketState.UnconnectedState:
log.ipc.debug("Socket was disconnected immediately.")
self.on_disconnected()
- @pyqtSlot()
+ @core.pyqtSlot()
def on_disconnected(self):
"""Clean up socket when the client disconnected."""
log.ipc.debug("Client disconnected from socket 0x{:x}.".format(
@@ -381,7 +378,7 @@ class IPCServer(QObject):
return socket
- @pyqtSlot()
+ @core.pyqtSlot()
def on_ready_read(self):
"""Read json data from the client."""
self._timer.stop()
@@ -398,7 +395,7 @@ class IPCServer(QObject):
if self._socket is not None:
self._timer.start()
- @pyqtSlot()
+ @core.pyqtSlot()
def on_timeout(self):
"""Cancel the current connection if it was idle for too long."""
assert self._socket is not None
@@ -412,7 +409,7 @@ class IPCServer(QObject):
# on_socket_disconnected sets it to None
self._socket.abort()
- @pyqtSlot()
+ @core.pyqtSlot()
def update_atime(self):
"""Update the atime of the socket file all few hours.
@@ -437,7 +434,7 @@ class IPCServer(QObject):
self._server.close()
self.listen()
- @pyqtSlot()
+ @core.pyqtSlot()
def shutdown(self):
"""Shut down the IPC server cleanly."""
log.ipc.debug("Shutting down IPC (socket 0x{:x})".format(
@@ -472,7 +469,7 @@ def send_to_running_instance(socketname, command, target_arg, *, socket=None):
True if connecting was successful, False if no connection was made.
"""
if socket is None:
- socket = QLocalSocket()
+ socket = network.QLocalSocket()
log.ipc.debug("Connecting to {}".format(socketname))
socket.connectToServer(socketname)
@@ -494,18 +491,18 @@ def send_to_running_instance(socketname, command, target_arg, *, socket=None):
log.ipc.debug("Writing: {!r}".format(data))
socket.writeData(data)
socket.waitForBytesWritten(WRITE_TIMEOUT)
- if socket.error() != QLocalSocket.LocalSocketError.UnknownSocketError:
+ if socket.error() != network.QLocalSocket.LocalSocketError.UnknownSocketError:
raise SocketError("writing to running instance", socket)
socket.disconnectFromServer()
- if socket.state() != QLocalSocket.LocalSocketState.UnconnectedState:
+ if socket.state() != network.QLocalSocket.LocalSocketState.UnconnectedState:
socket.waitForDisconnected(CONNECT_TIMEOUT)
return True
else:
- if socket.error() not in [QLocalSocket.LocalSocketError.ConnectionRefusedError,
- QLocalSocket.LocalSocketError.ServerNotFoundError]:
+ if socket.error() not in [network.QLocalSocket.LocalSocketError.ConnectionRefusedError,
+ network.QLocalSocket.LocalSocketError.ServerNotFoundError]:
raise SocketError("connecting to running instance", socket)
log.ipc.debug("No existing instance present ({})".format(
- debug.qenum_key(QLocalSocket, socket.error())))
+ debug.qenum_key(network.QLocalSocket, socket.error())))
return False
diff --git a/qutebrowser/misc/keyhintwidget.py b/qutebrowser/misc/keyhintwidget.py
index b16f6f39a..922f2c96a 100644
--- a/qutebrowser/misc/keyhintwidget.py
+++ b/qutebrowser/misc/keyhintwidget.py
@@ -27,18 +27,16 @@ It is intended to help discoverability of keybindings.
import html
import fnmatch
import re
-
-from qutebrowser.qt.widgets import QLabel, QSizePolicy
-from qutebrowser.qt.core import pyqtSlot, pyqtSignal, Qt
-from qutebrowser.qt.gui import QKeySequence
+from qutebrowser.qt import widgets, gui
from qutebrowser.config import config, stylesheet
from qutebrowser.utils import utils, usertypes
from qutebrowser.misc import objects
from qutebrowser.keyinput import keyutils
+from qutebrowser.qt import core
-class KeyHintView(QLabel):
+class KeyHintView(widgets.QLabel):
"""The view showing hints for key bindings based on the current key string.
@@ -62,13 +60,13 @@ class KeyHintView(QLabel):
{% endif %}
}
"""
- update_geometry = pyqtSignal()
+ update_geometry = core.pyqtSignal()
def __init__(self, win_id, parent=None):
super().__init__(parent)
- self.setTextFormat(Qt.TextFormat.RichText)
+ self.setTextFormat(core.Qt.TextFormat.RichText)
self._win_id = win_id
- self.setSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Minimum)
+ self.setSizePolicy(widgets.QSizePolicy.Policy.Fixed, widgets.QSizePolicy.Policy.Minimum)
self.hide()
self._show_timer = usertypes.Timer(self, 'keyhint_show')
self._show_timer.timeout.connect(self.show)
@@ -83,7 +81,7 @@ class KeyHintView(QLabel):
self.update_geometry.emit()
super().showEvent(e)
- @pyqtSlot(usertypes.KeyMode, str)
+ @core.pyqtSlot(usertypes.KeyMode, str)
def update_keyhint(self, mode, prefix):
"""Show hints for the given prefix (or hide if prefix is empty).
@@ -114,7 +112,7 @@ class KeyHintView(QLabel):
bindings = [
(k, v)
for (k, v) in sorted(bindings_dict.items())
- if keyutils.KeySequence.parse(prefix).matches(k) != QKeySequence.SequenceMatch.NoMatch
+ if keyutils.KeySequence.parse(prefix).matches(k) != gui.QKeySequence.SequenceMatch.NoMatch
and not blacklisted(str(k))
and (takes_count(v) or not countstr)
]
diff --git a/qutebrowser/misc/lineparser.py b/qutebrowser/misc/lineparser.py
index a270798b5..74306f0a6 100644
--- a/qutebrowser/misc/lineparser.py
+++ b/qutebrowser/misc/lineparser.py
@@ -24,13 +24,12 @@ import os.path
import contextlib
from typing import Sequence
-from qutebrowser.qt.core import pyqtSlot, pyqtSignal, QObject
-
from qutebrowser.utils import log, utils, qtutils
from qutebrowser.config import config
+from qutebrowser.qt import core
-class BaseLineParser(QObject):
+class BaseLineParser(core.QObject):
"""A LineParser without any real data.
@@ -44,7 +43,7 @@ class BaseLineParser(QObject):
changed: Emitted when the history was changed.
"""
- changed = pyqtSignal()
+ changed = core.pyqtSignal()
def __init__(self, configdir, fname, *, binary=False, parent=None):
"""Constructor.
@@ -218,7 +217,7 @@ class LimitLineParser(LineParser):
configdir=self._configdir, fname=self._fname,
limit=self._limit, binary=self._binary)
- @pyqtSlot(str)
+ @core.pyqtSlot(str)
def _cleanup_file(self, option):
"""Delete the file if the limit was changed to 0."""
assert self._configfile is not None
diff --git a/qutebrowser/misc/miscwidgets.py b/qutebrowser/misc/miscwidgets.py
index 5d56f7fcf..f1227797e 100644
--- a/qutebrowser/misc/miscwidgets.py
+++ b/qutebrowser/misc/miscwidgets.py
@@ -21,16 +21,12 @@
from typing import Optional
-from qutebrowser.qt.core import pyqtSlot, pyqtSignal, Qt, QSize, QTimer
-from qutebrowser.qt.widgets import (QLineEdit, QWidget, QHBoxLayout, QLabel,
- QStyleOption, QStyle, QLayout, QSplitter)
-from qutebrowser.qt.gui import QValidator, QPainter, QResizeEvent
-
from qutebrowser.config import config, configfiles
from qutebrowser.utils import utils, log, usertypes, debug
from qutebrowser.misc import cmdhistory
from qutebrowser.browser import inspector
from qutebrowser.keyinput import keyutils, modeman
+from qutebrowser.qt import widgets, gui, core
class MinimalLineEditMixin:
@@ -48,11 +44,11 @@ class MinimalLineEditMixin:
"""
)
self.setAttribute( # type: ignore[attr-defined]
- Qt.WidgetAttribute.WA_MacShowFocusRect, False)
+ core.Qt.WidgetAttribute.WA_MacShowFocusRect, False)
def keyPressEvent(self, e):
"""Override keyPressEvent to paste primary selection on Shift + Ins."""
- if e.key() == Qt.Key.Key_Insert and e.modifiers() == Qt.KeyboardModifier.ShiftModifier:
+ if e.key() == core.Qt.Key.Key_Insert and e.modifiers() == core.Qt.KeyboardModifier.ShiftModifier:
try:
text = utils.get_clipboard(selection=True, fallback=True)
except utils.ClipboardError:
@@ -67,7 +63,7 @@ class MinimalLineEditMixin:
return utils.get_repr(self)
-class CommandLineEdit(QLineEdit):
+class CommandLineEdit(widgets.QLineEdit):
"""A QLineEdit with a history and prompt chars.
@@ -89,12 +85,12 @@ class CommandLineEdit(QLineEdit):
def __repr__(self):
return utils.get_repr(self, text=self.text())
- @pyqtSlot(str)
+ @core.pyqtSlot(str)
def on_text_edited(self, _text):
"""Slot for textEdited. Stop history browsing."""
self.history.stop()
- @pyqtSlot(int, int)
+ @core.pyqtSlot(int, int)
def __on_cursor_position_changed(self, _old, new):
"""Prevent the cursor moving to the prompt.
@@ -113,7 +109,7 @@ class CommandLineEdit(QLineEdit):
self._promptlen = len(text)
-class _CommandValidator(QValidator):
+class _CommandValidator(gui.QValidator):
"""Validator to prevent the : from getting deleted.
@@ -136,12 +132,12 @@ class _CommandValidator(QValidator):
A tuple (status, string, pos) as a QValidator should.
"""
if self.prompt is None or string.startswith(self.prompt):
- return (QValidator.State.Acceptable, string, pos)
+ return (gui.QValidator.State.Acceptable, string, pos)
else:
- return (QValidator.State.Invalid, string, pos)
+ return (gui.QValidator.State.Invalid, string, pos)
-class DetailFold(QWidget):
+class DetailFold(widgets.QWidget):
"""A "fold" widget with an arrow to show/hide details.
@@ -155,16 +151,16 @@ class DetailFold(QWidget):
arg 0: bool, if the contents are currently visible.
"""
- toggled = pyqtSignal(bool)
+ toggled = core.pyqtSignal(bool)
def __init__(self, text, parent=None):
super().__init__(parent)
self._folded = True
- self._hbox = QHBoxLayout(self)
+ self._hbox = widgets.QHBoxLayout(self)
self._hbox.setContentsMargins(0, 0, 0, 0)
self._arrow = _FoldArrow()
self._hbox.addWidget(self._arrow)
- label = QLabel(text)
+ label = widgets.QLabel(text)
self._hbox.addWidget(label)
self._hbox.addStretch()
@@ -180,14 +176,14 @@ class DetailFold(QWidget):
Args:
e: The QMouseEvent.
"""
- if e.button() == Qt.MouseButton.LeftButton:
+ if e.button() == core.Qt.MouseButton.LeftButton:
e.accept()
self.toggle()
else:
super().mousePressEvent(e)
-class _FoldArrow(QWidget):
+class _FoldArrow(widgets.QWidget):
"""The arrow shown for the DetailFold widget.
@@ -214,21 +210,21 @@ class _FoldArrow(QWidget):
Args:
_event: The QPaintEvent (unused).
"""
- opt = QStyleOption()
+ opt = widgets.QStyleOption()
opt.initFrom(self)
- painter = QPainter(self)
+ painter = gui.QPainter(self)
if self._folded:
- elem = QStyle.PrimitiveElement.PE_IndicatorArrowRight
+ elem = widgets.QStyle.PrimitiveElement.PE_IndicatorArrowRight
else:
- elem = QStyle.PrimitiveElement.PE_IndicatorArrowDown
+ elem = widgets.QStyle.PrimitiveElement.PE_IndicatorArrowDown
self.style().drawPrimitive(elem, opt, painter, self)
def minimumSizeHint(self):
"""Return a sensible size."""
- return QSize(8, 8)
+ return core.QSize(8, 8)
-class WrapperLayout(QLayout):
+class WrapperLayout(widgets.QLayout):
"""A Qt layout which simply wraps a single widget.
@@ -238,8 +234,8 @@ class WrapperLayout(QLayout):
def __init__(self, parent=None):
super().__init__(parent)
- self._widget: Optional[QWidget] = None
- self._container: Optional[QWidget] = None
+ self._widget: Optional[widgets.QWidget] = None
+ self._container: Optional[widgets.QWidget] = None
def addItem(self, _widget):
raise utils.Unreachable
@@ -247,7 +243,7 @@ class WrapperLayout(QLayout):
def sizeHint(self):
"""Get the size of the underlying widget."""
if self._widget is None:
- return QSize()
+ return core.QSize()
return self._widget.sizeHint()
def itemAt(self, _index):
@@ -283,7 +279,7 @@ class WrapperLayout(QLayout):
self._container.setFocusProxy(None) # type: ignore[arg-type]
-class FullscreenNotification(QLabel):
+class FullscreenNotification(widgets.QLabel):
"""A label telling the user this page is now fullscreen."""
@@ -313,16 +309,16 @@ class FullscreenNotification(QLabel):
def set_timeout(self, timeout):
"""Hide the widget after the given timeout."""
- QTimer.singleShot(timeout, self._on_timeout)
+ core.QTimer.singleShot(timeout, self._on_timeout)
- @pyqtSlot()
+ @core.pyqtSlot()
def _on_timeout(self):
"""Hide and delete the widget."""
self.hide()
self.deleteLater()
-class InspectorSplitter(QSplitter):
+class InspectorSplitter(widgets.QSplitter):
"""Allows putting an inspector inside the tab.
@@ -341,8 +337,8 @@ class InspectorSplitter(QSplitter):
_PROTECTED_MAIN_SIZE = 150
_SMALL_SIZE_THRESHOLD = 300
- def __init__(self, win_id: int, main_webview: QWidget,
- parent: QWidget = None) -> None:
+ def __init__(self, win_id: int, main_webview: widgets.QWidget,
+ parent: widgets.QWidget = None) -> None:
super().__init__(parent)
self._win_id = win_id
self.addWidget(main_webview)
@@ -386,10 +382,10 @@ class InspectorSplitter(QSplitter):
self._inspector_idx = 0
self._main_idx = 1
- self.setOrientation(Qt.Orientation.Horizontal
+ self.setOrientation(core.Qt.Orientation.Horizontal
if position in [inspector.Position.left,
inspector.Position.right]
- else Qt.Orientation.Vertical)
+ else core.Qt.Orientation.Vertical)
self.insertWidget(self._inspector_idx, inspector_widget)
self._position = position
self._load_preferred_size()
@@ -404,7 +400,7 @@ class InspectorSplitter(QSplitter):
def _load_preferred_size(self) -> None:
"""Load the preferred size of the inspector widget."""
assert self._position is not None
- full = (self.width() if self.orientation() == Qt.Orientation.Horizontal
+ full = (self.width() if self.orientation() == core.Qt.Orientation.Horizontal
else self.height())
# If we first open the inspector with a window size of < 300px
@@ -468,29 +464,29 @@ class InspectorSplitter(QSplitter):
# Case 3 above
pass
- @pyqtSlot()
+ @core.pyqtSlot()
def _on_splitter_moved(self) -> None:
assert self._inspector_idx is not None
sizes = self.sizes()
self._preferred_size = sizes[self._inspector_idx]
self._save_preferred_size()
- def resizeEvent(self, e: QResizeEvent) -> None:
+ def resizeEvent(self, e: gui.QResizeEvent) -> None:
"""Window resize event."""
super().resizeEvent(e)
if self.count() == 2:
self._adjust_size()
-class KeyTesterWidget(QWidget):
+class KeyTesterWidget(widgets.QWidget):
"""Widget displaying key presses."""
def __init__(self, parent=None):
super().__init__(parent)
- self.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose)
- self._layout = QHBoxLayout(self)
- self._label = QLabel(text="Waiting for keypress...")
+ self.setAttribute(core.Qt.WidgetAttribute.WA_DeleteOnClose)
+ self._layout = widgets.QHBoxLayout(self)
+ self._label = widgets.QLabel(text="Waiting for keypress...")
self._layout.addWidget(self._label)
def keyPressEvent(self, e):
@@ -498,8 +494,8 @@ class KeyTesterWidget(QWidget):
lines = [
str(keyutils.KeyInfo.from_event(e)),
'',
- f"key: {debug.qenum_key(Qt.Key, e.key(), klass=Qt.Key)}",
- f"modifiers: {debug.qflags_key(Qt.KeyboardModifier, e.modifiers())}",
+ f"key: {debug.qenum_key(core.Qt.Key, e.key(), klass=core.Qt.Key)}",
+ f"modifiers: {debug.qflags_key(core.Qt.KeyboardModifier, e.modifiers())}",
'text: {!r}'.format(e.text()),
]
self._label.setText('\n'.join(lines))
diff --git a/qutebrowser/misc/msgbox.py b/qutebrowser/misc/msgbox.py
index 45ad2d44a..c0c5b704a 100644
--- a/qutebrowser/misc/msgbox.py
+++ b/qutebrowser/misc/msgbox.py
@@ -19,8 +19,7 @@
"""Convenience functions to show message boxes."""
-from qutebrowser.qt.core import Qt
-from qutebrowser.qt.widgets import QMessageBox
+from qutebrowser.qt import widgets, core
from qutebrowser.misc import objects
from qutebrowser.utils import log
@@ -34,7 +33,7 @@ class DummyBox:
pass
-def msgbox(parent, title, text, *, icon, buttons=QMessageBox.StandardButton.Ok,
+def msgbox(parent, title, text, *, icon, buttons=widgets.QMessageBox.StandardButton.Ok,
on_finished=None, plain_text=None):
"""Display a QMessageBox with the given icon.
@@ -55,16 +54,16 @@ def msgbox(parent, title, text, *, icon, buttons=QMessageBox.StandardButton.Ok,
log.misc.info(f'{title}\n\n{text}')
return DummyBox()
- box = QMessageBox(parent)
- box.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose)
+ box = widgets.QMessageBox(parent)
+ box.setAttribute(core.Qt.WidgetAttribute.WA_DeleteOnClose)
box.setIcon(icon)
box.setStandardButtons(buttons)
if on_finished is not None:
box.finished.connect(on_finished)
if plain_text:
- box.setTextFormat(Qt.TextFormat.PlainText)
+ box.setTextFormat(core.Qt.TextFormat.PlainText)
elif plain_text is not None:
- box.setTextFormat(Qt.TextFormat.RichText)
+ box.setTextFormat(core.Qt.TextFormat.RichText)
box.setWindowTitle(title)
box.setText(text)
box.show()
@@ -81,4 +80,4 @@ def information(*args, **kwargs):
Return:
A new QMessageBox.
"""
- return msgbox(*args, icon=QMessageBox.Icon.Information, **kwargs)
+ return msgbox(*args, icon=widgets.QMessageBox.Icon.Information, **kwargs)
diff --git a/qutebrowser/misc/pastebin.py b/qutebrowser/misc/pastebin.py
index afca59d2e..bc3ac0466 100644
--- a/qutebrowser/misc/pastebin.py
+++ b/qutebrowser/misc/pastebin.py
@@ -20,11 +20,10 @@
"""Client for the pastebin."""
import urllib.parse
+from qutebrowser.qt import core
-from qutebrowser.qt.core import pyqtSignal, pyqtSlot, QObject, QUrl
-
-class PastebinClient(QObject):
+class PastebinClient(core.QObject):
"""A client for Stikked pastebins using HTTPClient.
@@ -43,8 +42,8 @@ class PastebinClient(QObject):
API_URL = 'https://crashes.qutebrowser.org/api/'
MISC_API_URL = 'https://paste.the-compiler.org/api/'
- success = pyqtSignal(str)
- error = pyqtSignal(str)
+ success = core.pyqtSignal(str)
+ error = core.pyqtSignal(str)
def __init__(self, client, parent=None, api_url=API_URL):
"""Constructor.
@@ -81,10 +80,10 @@ class PastebinClient(QObject):
if private:
data['private'] = '1'
- url = QUrl(urllib.parse.urljoin(self._api_url, 'create'))
+ url = core.QUrl(urllib.parse.urljoin(self._api_url, 'create'))
self._client.post(url, data)
- @pyqtSlot(str)
+ @core.pyqtSlot(str)
def on_client_success(self, data):
"""Process the data and finish when the client finished.
diff --git a/qutebrowser/misc/quitter.py b/qutebrowser/misc/quitter.py
index 3169e8bfa..97e040dbe 100644
--- a/qutebrowser/misc/quitter.py
+++ b/qutebrowser/misc/quitter.py
@@ -30,8 +30,6 @@ import tokenize
import functools
import subprocess
from typing import Iterable, Mapping, MutableSequence, Sequence, cast
-
-from qutebrowser.qt.core import QObject, pyqtSignal, QTimer
try:
import hunter
except ImportError:
@@ -43,12 +41,13 @@ from qutebrowser.utils import log
from qutebrowser.misc import sessions, ipc, objects
from qutebrowser.mainwindow import prompt
from qutebrowser.completion.models import miscmodels
+from qutebrowser.qt import core
instance = cast('Quitter', None)
-class Quitter(QObject):
+class Quitter(core.QObject):
"""Utility class to quit/restart the QApplication.
@@ -58,11 +57,11 @@ class Quitter(QObject):
_args: The argparse namespace.
"""
- shutting_down = pyqtSignal() # Emitted immediately before shut down
+ shutting_down = core.pyqtSignal() # Emitted immediately before shut down
def __init__(self, *,
args: argparse.Namespace,
- parent: QObject = None) -> None:
+ parent: core.QObject = None) -> None:
super().__init__(parent)
self.quit_status = {
'crash': True,
@@ -230,7 +229,7 @@ class Quitter(QObject):
# in the real main event loop, or we'll get a segfault.
log.destroy.debug("Deferring real shutdown because question was "
"active.")
- QTimer.singleShot(0, functools.partial(self._shutdown_2, status,
+ core.QTimer.singleShot(0, functools.partial(self._shutdown_2, status,
is_restart=is_restart))
else:
# If we have no questions to shut down, we are already in the real
@@ -254,7 +253,7 @@ class Quitter(QObject):
log.destroy.debug("Deferring QApplication::exit...")
# We use a singleshot timer to exit here to minimize the likelihood of
# segfaults.
- QTimer.singleShot(0, functools.partial(self._shutdown_3, status))
+ core.QTimer.singleShot(0, functools.partial(self._shutdown_3, status))
def _shutdown_3(self, status: int) -> None:
"""Finally shut down the QApplication."""
diff --git a/qutebrowser/misc/savemanager.py b/qutebrowser/misc/savemanager.py
index ed1b90890..1fd261497 100644
--- a/qutebrowser/misc/savemanager.py
+++ b/qutebrowser/misc/savemanager.py
@@ -23,12 +23,11 @@ import os.path
import collections
from typing import MutableMapping
-from qutebrowser.qt.core import pyqtSlot, QObject, QTimer
-
from qutebrowser.config import config
from qutebrowser.api import cmdutils
from qutebrowser.utils import utils, log, message, usertypes, error
from qutebrowser.misc import objects
+from qutebrowser.qt import core
class Saveable:
@@ -101,7 +100,7 @@ class Saveable:
self._dirty = False
-class SaveManager(QObject):
+class SaveManager(core.QObject):
"""Responsible to save 'saveables' periodically and on exit.
@@ -150,7 +149,7 @@ class SaveManager(QObject):
self.saveables[name] = saveable
if dirty:
saveable.mark_dirty()
- QTimer.singleShot(0, saveable.save)
+ core.QTimer.singleShot(0, saveable.save)
def save(self, name, is_exit=False, explicit=False, silent=False,
force=False):
@@ -172,7 +171,7 @@ class SaveManager(QObject):
for saveable in self.saveables:
self.save(saveable, *args, **kwargs)
- @pyqtSlot()
+ @core.pyqtSlot()
def autosave(self):
"""Slot used when the configs are auto-saved."""
for (key, saveable) in self.saveables.items():
@@ -205,7 +204,7 @@ class SaveManager(QObject):
message.error("Could not save {}: {}".format(key, e))
log.save.debug(":save saved {}".format(', '.join(what)))
- @pyqtSlot()
+ @core.pyqtSlot()
def shutdown(self):
"""Save all saveables when shutting down."""
for key in self.saveables:
diff --git a/qutebrowser/misc/sessions.py b/qutebrowser/misc/sessions.py
index bfb2d4347..39dc4490f 100644
--- a/qutebrowser/misc/sessions.py
+++ b/qutebrowser/misc/sessions.py
@@ -26,8 +26,6 @@ import urllib
import shutil
import pathlib
from typing import Any, Iterable, MutableMapping, MutableSequence, Optional, Union, cast
-
-from qutebrowser.qt.core import Qt, QUrl, QObject, QPoint, QTimer, QDateTime
import yaml
from qutebrowser.utils import (standarddir, objreg, qtutils, log, message,
@@ -36,7 +34,7 @@ from qutebrowser.api import cmdutils
from qutebrowser.config import config, configfiles
from qutebrowser.completion.models import miscmodels
from qutebrowser.mainwindow import mainwindow
-from qutebrowser.qt import sip
+from qutebrowser.qt import core, sip
from qutebrowser.misc import objects, throttle
@@ -136,7 +134,7 @@ class TabHistoryItem:
last_visited=self.last_visited)
-class SessionManager(QObject):
+class SessionManager(core.QObject):
"""Manager for sessions.
@@ -220,7 +218,7 @@ class SessionManager(QObject):
# QtWebEngine
user_data = None
- data['last_visited'] = item.lastVisited().toString(Qt.DateFormat.ISODate)
+ data['last_visited'] = item.lastVisited().toString(core.Qt.DateFormat.ISODate)
if tab.history.current_idx() == idx:
pos = tab.scroller.pos_px()
@@ -411,10 +409,10 @@ class SessionManager(QObject):
# of per-tab earlier.
# See https://github.com/qutebrowser/qutebrowser/issues/728
pos = data['scroll-pos']
- user_data['scroll-pos'] = QPoint(pos['x'], pos['y'])
+ user_data['scroll-pos'] = core.QPoint(pos['x'], pos['y'])
elif 'scroll-pos' in histentry:
pos = histentry['scroll-pos']
- user_data['scroll-pos'] = QPoint(pos['x'], pos['y'])
+ user_data['scroll-pos'] = core.QPoint(pos['x'], pos['y'])
if 'pinned' in histentry:
new_tab.data.pinned = histentry['pinned']
@@ -434,18 +432,18 @@ class SessionManager(QObject):
histentry['active'] = False
active = histentry.get('active', False)
- url = QUrl.fromEncoded(histentry['url'].encode('ascii'))
+ url = core.QUrl.fromEncoded(histentry['url'].encode('ascii'))
if 'original-url' in histentry:
- orig_url = QUrl.fromEncoded(
+ orig_url = core.QUrl.fromEncoded(
histentry['original-url'].encode('ascii'))
else:
orig_url = url
if histentry.get("last_visited"):
- last_visited: Optional[QDateTime] = QDateTime.fromString(
+ last_visited: Optional[core.QDateTime] = core.QDateTime.fromString(
histentry.get("last_visited"),
- Qt.DateFormat.ISODate,
+ core.Qt.DateFormat.ISODate,
)
else:
last_visited = None
@@ -481,7 +479,7 @@ class SessionManager(QObject):
if tab_to_focus is not None:
tabbed_browser.widget.setCurrentIndex(tab_to_focus)
if win.get('active', False):
- QTimer.singleShot(0, tabbed_browser.widget.activateWindow)
+ core.QTimer.singleShot(0, tabbed_browser.widget.activateWindow)
def load(self, name, temp=False):
"""Load a named session.
diff --git a/qutebrowser/misc/sql.py b/qutebrowser/misc/sql.py
index d7b3dda0d..94aee2750 100644
--- a/qutebrowser/misc/sql.py
+++ b/qutebrowser/misc/sql.py
@@ -25,10 +25,7 @@ import dataclasses
import types
from typing import Any, Dict, Iterator, List, Mapping, MutableSequence, Optional, Type
-from qutebrowser.qt.core import QObject, pyqtSignal
-from qutebrowser.qt.sql import QSqlDatabase, QSqlError, QSqlQuery
-
-from qutebrowser.qt import sip
+from qutebrowser.qt import sql, core, sip
from qutebrowser.utils import debug, log
@@ -93,7 +90,7 @@ class Error(Exception):
"""Base class for all SQL related errors."""
- def __init__(self, msg: str, error: Optional[QSqlError] = None) -> None:
+ def __init__(self, msg: str, error: Optional[sql.QSqlError] = None) -> None:
super().__init__(msg)
self.error = error
@@ -125,14 +122,14 @@ class BugError(Error):
"""
-def raise_sqlite_error(msg: str, error: QSqlError) -> None:
+def raise_sqlite_error(msg: str, error: sql.QSqlError) -> None:
"""Raise either a BugError or KnownError."""
error_code = error.nativeErrorCode()
database_text = error.databaseText()
driver_text = error.driverText()
log.sql.debug("SQL error:")
- log.sql.debug(f"type: {debug.qenum_key(QSqlError, error.type())}")
+ log.sql.debug(f"type: {debug.qenum_key(sql.QSqlError, error.type())}")
log.sql.debug(f"database text: {database_text}")
log.sql.debug(f"driver text: {driver_text}")
log.sql.debug(f"error code: {error_code}")
@@ -169,11 +166,11 @@ class Database:
_USER_VERSION = UserVersion(0, 4) # The current / newest user version
def __init__(self, path: str) -> None:
- if QSqlDatabase.database(path).isValid():
+ if sql.QSqlDatabase.database(path).isValid():
raise BugError(f'A connection to the database at "{path}" already exists')
self._path = path
- database = QSqlDatabase.addDatabase('QSQLITE', path)
+ database = sql.QSqlDatabase.addDatabase('QSQLITE', path)
if not database.isValid():
raise KnownError('Failed to add database. Are sqlite and Qt sqlite '
'support installed?')
@@ -200,9 +197,9 @@ class Database:
self.query("PRAGMA journal_mode=WAL").run()
self.query("PRAGMA synchronous=NORMAL").run()
- def qt_database(self) -> QSqlDatabase:
+ def qt_database(self) -> sql.QSqlDatabase:
"""Return the wrapped QSqlDatabase instance."""
- database = QSqlDatabase.database(self._path, open=True)
+ database = sql.QSqlDatabase.database(self._path, open=True)
if not database.isValid():
raise BugError('Failed to get connection. Did you close() this Database '
'instance?')
@@ -214,7 +211,7 @@ class Database:
def table(self, name: str, fields: List[str],
constraints: Optional[Dict[str, str]] = None,
- parent: Optional[QObject] = None) -> 'SqlTable':
+ parent: Optional[core.QObject] = None) -> 'SqlTable':
"""Return a SqlTable instance linked to this Database."""
return SqlTable(self, name, fields, constraints, parent)
@@ -238,7 +235,7 @@ class Database:
database = self.qt_database()
database.close()
sip.delete(database)
- QSqlDatabase.removeDatabase(self._path)
+ sql.QSqlDatabase.removeDatabase(self._path)
def transaction(self) -> 'Transaction':
"""Return a Transaction object linked to this Database."""
@@ -293,7 +290,7 @@ class Query:
Must be false for completion queries.
"""
self._database = database
- self.query = QSqlQuery(database.qt_database())
+ self.query = sql.QSqlQuery(database.qt_database())
log.sql.vdebug(f'Preparing: {querystr}') # type: ignore[attr-defined]
ok = self.query.prepare(querystr)
@@ -396,7 +393,7 @@ class Query:
}
-class SqlTable(QObject):
+class SqlTable(core.QObject):
"""Interface to a SQL table.
@@ -408,12 +405,12 @@ class SqlTable(QObject):
changed: Emitted when the table is modified.
"""
- changed = pyqtSignal()
+ changed = core.pyqtSignal()
database: Database
def __init__(self, database: Database, name: str, fields: List[str],
constraints: Optional[Dict[str, str]] = None,
- parent: Optional[QObject] = None) -> None:
+ parent: Optional[core.QObject] = None) -> None:
"""Wrapper over a table in the SQL database.
Args:
diff --git a/qutebrowser/misc/throttle.py b/qutebrowser/misc/throttle.py
index 5e4dd13b2..705be400b 100644
--- a/qutebrowser/misc/throttle.py
+++ b/qutebrowser/misc/throttle.py
@@ -23,7 +23,7 @@ import dataclasses
import time
from typing import Any, Callable, Mapping, Optional, Sequence
-from qutebrowser.qt.core import QObject
+from qutebrowser.qt import core
from qutebrowser.utils import usertypes
@@ -35,7 +35,7 @@ class _CallArgs:
kwargs: Mapping[str, Any]
-class Throttle(QObject):
+class Throttle(core.QObject):
"""A throttle to throttle calls.
@@ -47,7 +47,7 @@ class Throttle(QObject):
def __init__(self,
func: Callable[..., None],
delay_ms: int,
- parent: QObject = None) -> None:
+ parent: core.QObject = None) -> None:
"""Constructor.
Args:
diff --git a/qutebrowser/misc/utilcmds.py b/qutebrowser/misc/utilcmds.py
index d94b32c26..a7d19d8bc 100644
--- a/qutebrowser/misc/utilcmds.py
+++ b/qutebrowser/misc/utilcmds.py
@@ -27,8 +27,7 @@ import sys
import traceback
from typing import Optional
-from qutebrowser.qt.core import QUrl
-from qutebrowser.qt.widgets import QApplication
+from qutebrowser.qt import widgets, core
from qutebrowser.browser import qutescheme
from qutebrowser.utils import log, objreg, usertypes, message, debug, utils
@@ -55,7 +54,7 @@ def later(duration: str, command: str, win_id: int) -> None:
except ValueError as e:
raise cmdutils.CommandError(e)
commandrunner = runners.CommandRunner(win_id)
- timer = usertypes.Timer(name='later', parent=QApplication.instance())
+ timer = usertypes.Timer(name='later', parent=widgets.QApplication.instance())
try:
timer.setSingleShot(True)
try:
@@ -183,7 +182,7 @@ def debug_pyeval(s: str, file: bool = False, quiet: bool = False) -> None:
else:
tabbed_browser = objreg.get('tabbed-browser', scope='window',
window='last-focused')
- tabbed_browser.load_url(QUrl('qute://pyeval'), newtab=True)
+ tabbed_browser.load_url(core.QUrl('qute://pyeval'), newtab=True)
@cmdutils.register(debug=True)
@@ -273,7 +272,7 @@ def version(win_id: int, paste: bool = False) -> None:
"""
tabbed_browser = objreg.get('tabbed-browser', scope='window',
window=win_id)
- tabbed_browser.load_url(QUrl('qute://version/'), newtab=True)
+ tabbed_browser.load_url(core.QUrl('qute://version/'), newtab=True)
if paste:
pastebin_version()
diff --git a/qutebrowser/utils/debug.py b/qutebrowser/utils/debug.py
index ff6c3b9c2..06437d553 100644
--- a/qutebrowser/utils/debug.py
+++ b/qutebrowser/utils/debug.py
@@ -29,36 +29,34 @@ import types
from typing import (
Any, Callable, List, Mapping, MutableSequence, Optional, Sequence, Type, Union)
-from qutebrowser.qt.core import Qt, QEvent, QMetaMethod, QObject, pyqtBoundSignal
-
from qutebrowser.utils import log, utils, qtutils, objreg
from qutebrowser.misc import objects
-from qutebrowser.qt import sip
+from qutebrowser.qt import core, sip
-def log_events(klass: Type[QObject]) -> Type[QObject]:
+def log_events(klass: Type[core.QObject]) -> Type[core.QObject]:
"""Class decorator to log Qt events."""
old_event = klass.event
@functools.wraps(old_event)
- def new_event(self: Any, e: QEvent) -> bool:
+ def new_event(self: Any, e: core.QEvent) -> bool:
"""Wrapper for event() which logs events."""
# Passing klass as a WORKAROUND because with PyQt6, QEvent.type() returns int:
# https://www.riverbankcomputing.com/pipermail/pyqt/2022-April/044583.html
log.misc.debug("Event in {}: {}".format(
- utils.qualname(klass), qenum_key(QEvent, e.type(), klass=QEvent.Type)))
+ utils.qualname(klass), qenum_key(core.QEvent, e.type(), klass=core.QEvent.Type)))
return old_event(self, e)
klass.event = new_event # type: ignore[assignment]
return klass
-def log_signals(obj: QObject) -> QObject:
+def log_signals(obj: core.QObject) -> core.QObject:
"""Log all signals of an object or class.
Can be used as class decorator.
"""
- def log_slot(obj: QObject, signal: pyqtBoundSignal, *args: Any) -> None:
+ def log_slot(obj: core.QObject, signal: core.pyqtBoundSignal, *args: Any) -> None:
"""Slot connected to a signal to log it."""
dbg = dbg_signal(signal, args)
try:
@@ -67,13 +65,13 @@ def log_signals(obj: QObject) -> QObject:
r = '<deleted>'
log.signals.debug("Signal in {}: {}".format(r, dbg))
- def connect_log_slot(obj: QObject) -> None:
+ def connect_log_slot(obj: core.QObject) -> None:
"""Helper function to connect all signals to a logging slot."""
metaobj = obj.metaObject()
for i in range(metaobj.methodCount()):
meta_method = metaobj.method(i)
qtutils.ensure_valid(meta_method)
- if meta_method.methodType() == QMetaMethod.MethodType.Signal:
+ if meta_method.methodType() == core.QMetaMethod.MethodType.Signal:
name = meta_method.name().data().decode('ascii')
if name != 'destroyed':
signal = getattr(obj, name)
@@ -227,7 +225,7 @@ def qflags_key(base: Type[_EnumValueType],
return '|'.join(names)
-def signal_name(sig: pyqtBoundSignal) -> str:
+def signal_name(sig: core.pyqtBoundSignal) -> str:
"""Get a cleaned up name of a signal.
Unfortunately, the way to get the name of a signal differs based on
@@ -272,7 +270,7 @@ def format_args(args: Sequence[Any] = None, kwargs: Mapping[str, Any] = None) ->
return ', '.join(arglist)
-def dbg_signal(sig: pyqtBoundSignal, args: Any) -> str:
+def dbg_signal(sig: core.pyqtBoundSignal, args: Any) -> str:
"""Get a string representation of a signal for debugging.
Args:
@@ -360,15 +358,15 @@ def _get_widgets() -> Sequence[str]:
def _get_pyqt_objects(lines: MutableSequence[str],
- obj: QObject,
+ obj: core.QObject,
depth: int = 0) -> None:
"""Recursive method for get_all_objects to get Qt objects."""
- for kid in obj.findChildren(QObject, '', Qt.FindChildOption.FindDirectChildrenOnly):
+ for kid in obj.findChildren(core.QObject, '', core.Qt.FindChildOption.FindDirectChildrenOnly):
lines.append(' ' * depth + repr(kid))
_get_pyqt_objects(lines, kid, depth + 1)
-def get_all_objects(start_obj: QObject = None) -> str:
+def get_all_objects(start_obj: core.QObject = None) -> str:
"""Get all children of an object recursively as a string."""
output = ['']
widget_lines = _get_widgets()
diff --git a/qutebrowser/utils/error.py b/qutebrowser/utils/error.py
index 3a155a4fe..7505900cd 100644
--- a/qutebrowser/utils/error.py
+++ b/qutebrowser/utils/error.py
@@ -19,7 +19,7 @@
"""Tools related to error printing/displaying."""
-from qutebrowser.qt.widgets import QMessageBox
+from qutebrowser.qt import widgets
from qutebrowser.utils import log, utils
@@ -70,5 +70,5 @@ def handle_fatal_exc(exc: BaseException,
msg_text = str(exc)
if post_text:
msg_text += '\n\n{}'.format(post_text)
- msgbox = QMessageBox(QMessageBox.Icon.Critical, title, msg_text)
+ msgbox = widgets.QMessageBox(widgets.QMessageBox.Icon.Critical, title, msg_text)
msgbox.exec()
diff --git a/qutebrowser/utils/jinja.py b/qutebrowser/utils/jinja.py
index 5775b317b..0635fc7b1 100644
--- a/qutebrowser/utils/jinja.py
+++ b/qutebrowser/utils/jinja.py
@@ -29,7 +29,7 @@ from typing import Any, Callable, FrozenSet, Iterator, List, Set, Tuple
import jinja2
import jinja2.nodes
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import core
from qutebrowser.utils import utils, urlutils, log, qtutils, resources
from qutebrowser.misc import debugcachestats
@@ -111,10 +111,10 @@ class Environment(jinja2.Environment):
path: The relative path to the resource.
"""
assert not posixpath.isabs(path), path
- url = QUrl('qute://resource')
+ url = core.QUrl('qute://resource')
url.setPath('/' + path)
urlutils.ensure_valid(url)
- urlstr = url.toString(QUrl.ComponentFormattingOption.FullyEncoded) # type: ignore[arg-type]
+ urlstr = url.toString(core.QUrl.ComponentFormattingOption.FullyEncoded) # type: ignore[arg-type]
return urlstr
def _data_url(self, path: str) -> str:
diff --git a/qutebrowser/utils/log.py b/qutebrowser/utils/log.py
index ab94aa40d..c0da78b90 100644
--- a/qutebrowser/utils/log.py
+++ b/qutebrowser/utils/log.py
@@ -35,7 +35,7 @@ import argparse
from typing import (TYPE_CHECKING, Any, Iterator, Mapping, MutableSequence,
Optional, Set, Tuple, Union)
-from qutebrowser.qt import core as qtcore
+from qutebrowser.qt import core
# Optional imports
try:
import colorama
@@ -211,13 +211,13 @@ def init_log(args: argparse.Namespace) -> None:
root.setLevel(logging.NOTSET)
logging.captureWarnings(True)
_init_py_warnings()
- qtcore.qInstallMessageHandler(qt_message_handler)
+ core.qInstallMessageHandler(qt_message_handler)
_log_inited = True
-@qtcore.pyqtSlot()
+@core.pyqtSlot()
def shutdown_log() -> None:
- qtcore.qInstallMessageHandler(None)
+ core.qInstallMessageHandler(None)
def _init_py_warnings() -> None:
@@ -236,11 +236,11 @@ def _init_py_warnings() -> None:
@contextlib.contextmanager
def disable_qt_msghandler() -> Iterator[None]:
"""Contextmanager which temporarily disables the Qt message handler."""
- old_handler = qtcore.qInstallMessageHandler(None)
+ old_handler = core.qInstallMessageHandler(None)
try:
yield
finally:
- qtcore.qInstallMessageHandler(old_handler)
+ core.qInstallMessageHandler(old_handler)
@contextlib.contextmanager
@@ -378,8 +378,8 @@ def change_console_formatter(level: int) -> None:
assert isinstance(old_formatter, JSONFormatter), old_formatter
-def qt_message_handler(msg_type: qtcore.QtMsgType,
- context: qtcore.QMessageLogContext,
+def qt_message_handler(msg_type: core.QtMsgType,
+ context: core.QMessageLogContext,
msg: str) -> None:
"""Qt message handler to redirect qWarning etc. to the logging system.
@@ -392,11 +392,11 @@ def qt_message_handler(msg_type: qtcore.QtMsgType,
# Note we map critical to ERROR as it's actually "just" an error, and fatal
# to critical.
qt_to_logging = {
- qtcore.QtMsgType.QtDebugMsg: logging.DEBUG,
- qtcore.QtMsgType.QtWarningMsg: logging.WARNING,
- qtcore.QtMsgType.QtCriticalMsg: logging.ERROR,
- qtcore.QtMsgType.QtFatalMsg: logging.CRITICAL,
- qtcore.QtMsgType.QtInfoMsg: logging.INFO,
+ core.QtMsgType.QtDebugMsg: logging.DEBUG,
+ core.QtMsgType.QtWarningMsg: logging.WARNING,
+ core.QtMsgType.QtCriticalMsg: logging.ERROR,
+ core.QtMsgType.QtFatalMsg: logging.CRITICAL,
+ core.QtMsgType.QtInfoMsg: logging.INFO,
}
# Change levels of some well-known messages to debug so they don't get
diff --git a/qutebrowser/utils/message.py b/qutebrowser/utils/message.py
index 10183afee..18b1c2e67 100644
--- a/qutebrowser/utils/message.py
+++ b/qutebrowser/utils/message.py
@@ -27,9 +27,8 @@ import dataclasses
import traceback
from typing import Any, Callable, Iterable, List, Union, Optional
-from qutebrowser.qt.core import pyqtSignal, pyqtBoundSignal, QObject
-
from qutebrowser.utils import usertypes, log
+from qutebrowser.qt import core
@dataclasses.dataclass
@@ -123,7 +122,7 @@ def _build_question(title: str,
text: str = None, *,
mode: usertypes.PromptMode,
default: Union[None, bool, str] = None,
- abort_on: Iterable[pyqtBoundSignal] = (),
+ abort_on: Iterable[core.pyqtBoundSignal] = (),
url: str = None,
option: bool = None) -> usertypes.Question:
"""Common function for ask/ask_async."""
@@ -222,7 +221,7 @@ def confirm_async(*, yes_action: _ActionType,
return question
-class GlobalMessageBridge(QObject):
+class GlobalMessageBridge(core.QObject):
"""Global (not per-window) message bridge for errors/infos/warnings.
@@ -245,13 +244,13 @@ class GlobalMessageBridge(QObject):
mode_left: Emitted when a keymode was left in any window.
"""
- show_message = pyqtSignal(MessageInfo)
- prompt_done = pyqtSignal(usertypes.KeyMode)
- ask_question = pyqtSignal(usertypes.Question, bool)
- mode_left = pyqtSignal(usertypes.KeyMode)
- clear_messages = pyqtSignal()
+ show_message = core.pyqtSignal(MessageInfo)
+ prompt_done = core.pyqtSignal(usertypes.KeyMode)
+ ask_question = core.pyqtSignal(usertypes.Question, bool)
+ mode_left = core.pyqtSignal(usertypes.KeyMode)
+ clear_messages = core.pyqtSignal()
- def __init__(self, parent: QObject = None) -> None:
+ def __init__(self, parent: core.QObject = None) -> None:
super().__init__(parent)
self._connected = False
self._cache: List[MessageInfo] = []
diff --git a/qutebrowser/utils/objreg.py b/qutebrowser/utils/objreg.py
index 3b6823df4..5049275f3 100644
--- a/qutebrowser/utils/objreg.py
+++ b/qutebrowser/utils/objreg.py
@@ -24,12 +24,11 @@ import collections
import functools
from typing import (TYPE_CHECKING, Any, Callable, MutableMapping, MutableSequence,
Optional, Sequence, Union)
-
-from qutebrowser.qt.core import QObject, QTimer
-from qutebrowser.qt.widgets import QApplication
-from qutebrowser.qt.widgets import QWidget
+from qutebrowser.qt import widgets
from qutebrowser.utils import log, usertypes, utils
+from qutebrowser.qt import core
+
if TYPE_CHECKING:
from qutebrowser.mainwindow import mainwindow
@@ -85,7 +84,7 @@ class ObjectRegistry(collections.UserDict): # type: ignore[type-arg]
self._disconnect_destroyed(name)
- if isinstance(obj, QObject):
+ if isinstance(obj, core.QObject):
func = functools.partial(self.on_destroyed, name)
obj.destroyed.connect(func)
self._partial_objs[name] = func
@@ -124,7 +123,7 @@ class ObjectRegistry(collections.UserDict): # type: ignore[type-arg]
registry.
"""
log.destroy.debug("schedule removal: {}".format(name))
- QTimer.singleShot(0, functools.partial(self._on_destroyed, name))
+ core.QTimer.singleShot(0, functools.partial(self._on_destroyed, name))
def _on_destroyed(self, name: str) -> None:
"""Remove a destroyed QObject."""
@@ -167,7 +166,7 @@ def _get_tab_registry(win_id: _WindowTab,
if tab_id is None:
raise ValueError("Got tab_id None (win_id {})".format(win_id))
if tab_id == 'current' and win_id is None:
- window: Optional[QWidget] = QApplication.activeWindow()
+ window: Optional[widgets.QWidget] = widgets.QApplication.activeWindow()
if window is None or not hasattr(window, 'win_id'):
raise RegistryUnavailableError('tab')
win_id = window.win_id # type: ignore[attr-defined]
@@ -193,7 +192,7 @@ def _get_window_registry(window: _WindowTab) -> ObjectRegistry:
raise TypeError("window is None with scope window!")
try:
if window == 'current':
- win: Optional[QWidget] = QApplication.activeWindow()
+ win: Optional[widgets.QWidget] = widgets.QApplication.activeWindow()
elif window == 'last-focused':
win = last_focused_window()
else:
diff --git a/qutebrowser/utils/qtutils.py b/qutebrowser/utils/qtutils.py
index 0bd9c94e8..8d0e1bd62 100644
--- a/qutebrowser/utils/qtutils.py
+++ b/qutebrowser/utils/qtutils.py
@@ -35,21 +35,18 @@ import operator
import contextlib
from typing import (Any, AnyStr, TYPE_CHECKING, BinaryIO, IO, Iterator,
Optional, Union, Tuple, cast)
-
-from qutebrowser.qt.core import (qVersion, QEventLoop, QDataStream, QByteArray,
- QIODevice, QFileDevice, QSaveFile, QT_VERSION_STR,
- PYQT_VERSION_STR, QObject, QUrl, QLibraryInfo)
-from qutebrowser.qt.gui import QColor
+from qutebrowser.qt import webkit, webenginewidgets, gui
try:
- from qutebrowser.qt.webkit import qWebKitVersion
+ pass
except ImportError: # pragma: no cover
qWebKitVersion = None # type: ignore[assignment] # noqa: N816
if TYPE_CHECKING:
- from qutebrowser.qt.webkit import QWebHistory
- from qutebrowser.qt.webenginewidgets import QWebEngineHistory
+ from qutebrowser.qt import QWebHistory
+ from qutebrowser.qt import QWebEngineHistory
from qutebrowser.misc import objects
from qutebrowser.utils import usertypes, utils
+from qutebrowser.qt import core
MAXVALS = {
@@ -71,17 +68,17 @@ class QtOSError(OSError):
qt_errno: The error attribute of the given QFileDevice, if applicable.
"""
- def __init__(self, dev: QIODevice, msg: str = None) -> None:
+ def __init__(self, dev: core.QIODevice, msg: str = None) -> None:
if msg is None:
msg = dev.errorString()
- self.qt_errno: Optional[QFileDevice.FileError] = None
- if isinstance(dev, QFileDevice):
+ self.qt_errno: Optional[core.QFileDevice.FileError] = None
+ if isinstance(dev, core.QFileDevice):
msg = self._init_filedev(dev, msg)
super().__init__(msg)
- def _init_filedev(self, dev: QFileDevice, msg: str) -> str:
+ def _init_filedev(self, dev: core.QFileDevice, msg: str) -> str:
self.qt_errno = dev.error()
filename = dev.fileName()
msg += ": {!r}".format(filename)
@@ -103,13 +100,13 @@ def version_check(version: str,
parsed = utils.VersionNumber.parse(version)
op = operator.eq if exact else operator.ge
- result = op(utils.VersionNumber.parse(qVersion()), parsed)
+ result = op(utils.VersionNumber.parse(core.qVersion()), parsed)
if compiled and result:
# qVersion() ==/>= parsed, now check if QT_VERSION_STR ==/>= parsed.
- result = op(utils.VersionNumber.parse(QT_VERSION_STR), parsed)
+ result = op(utils.VersionNumber.parse(core.QT_VERSION_STR), parsed)
if compiled and result:
# Finally, check PYQT_VERSION_STR as well.
- result = op(utils.VersionNumber.parse(PYQT_VERSION_STR), parsed)
+ result = op(utils.VersionNumber.parse(core.PYQT_VERSION_STR), parsed)
return result
@@ -118,8 +115,8 @@ MAX_WORLD_ID = 256
def is_new_qtwebkit() -> bool:
"""Check if the given version is a new QtWebKit."""
- assert qWebKitVersion is not None
- return (utils.VersionNumber.parse(qWebKitVersion()) >
+ assert webkit.qWebKitVersion is not None
+ return (utils.VersionNumber.parse(webkit.qWebKitVersion()) >
utils.VersionNumber.parse('538.1'))
@@ -172,44 +169,44 @@ def ensure_valid(obj: Validatable) -> None:
raise QtValueError(obj)
-def check_qdatastream(stream: QDataStream) -> None:
+def check_qdatastream(stream: core.QDataStream) -> None:
"""Check the status of a QDataStream and raise OSError if it's not ok."""
status_to_str = {
- QDataStream.Status.Ok: "The data stream is operating normally.",
- QDataStream.Status.ReadPastEnd: ("The data stream has read past the end of "
+ core.QDataStream.Status.Ok: "The data stream is operating normally.",
+ core.QDataStream.Status.ReadPastEnd: ("The data stream has read past the end of "
"the data in the underlying device."),
- QDataStream.Status.ReadCorruptData: "The data stream has read corrupt data.",
- QDataStream.Status.WriteFailed: ("The data stream cannot write to the "
+ core.QDataStream.Status.ReadCorruptData: "The data stream has read corrupt data.",
+ core.QDataStream.Status.WriteFailed: ("The data stream cannot write to the "
"underlying device."),
}
- if stream.status() != QDataStream.Status.Ok:
+ if stream.status() != core.QDataStream.Status.Ok:
raise OSError(status_to_str[stream.status()])
_QtSerializableType = Union[
- QObject,
- QByteArray,
- QUrl,
+ core.QObject,
+ core.QByteArray,
+ core.QUrl,
'QWebEngineHistory',
'QWebHistory'
]
-def serialize(obj: _QtSerializableType) -> QByteArray:
+def serialize(obj: _QtSerializableType) -> core.QByteArray:
"""Serialize an object into a QByteArray."""
- data = QByteArray()
- stream = QDataStream(data, QIODevice.OpenModeFlag.WriteOnly)
+ data = core.QByteArray()
+ stream = core.QDataStream(data, core.QIODevice.OpenModeFlag.WriteOnly)
serialize_stream(stream, obj)
return data
-def deserialize(data: QByteArray, obj: _QtSerializableType) -> None:
+def deserialize(data: core.QByteArray, obj: _QtSerializableType) -> None:
"""Deserialize an object from a QByteArray."""
- stream = QDataStream(data, QIODevice.OpenModeFlag.ReadOnly)
+ stream = core.QDataStream(data, core.QIODevice.OpenModeFlag.ReadOnly)
deserialize_stream(stream, obj)
-def serialize_stream(stream: QDataStream, obj: _QtSerializableType) -> None:
+def serialize_stream(stream: core.QDataStream, obj: _QtSerializableType) -> None:
"""Serialize an object into a QDataStream."""
# pylint: disable=pointless-statement
check_qdatastream(stream)
@@ -217,7 +214,7 @@ def serialize_stream(stream: QDataStream, obj: _QtSerializableType) -> None:
check_qdatastream(stream)
-def deserialize_stream(stream: QDataStream, obj: _QtSerializableType) -> None:
+def deserialize_stream(stream: core.QDataStream, obj: _QtSerializableType) -> None:
"""Deserialize a QDataStream into an object."""
# pylint: disable=pointless-statement
check_qdatastream(stream)
@@ -232,10 +229,10 @@ def savefile_open(
encoding: str = 'utf-8'
) -> Iterator[IO[AnyStr]]:
"""Context manager to easily use a QSaveFile."""
- f = QSaveFile(filename)
+ f = core.QSaveFile(filename)
cancelled = False
try:
- open_ok = f.open(QIODevice.OpenModeFlag.WriteOnly)
+ open_ok = f.open(core.QIODevice.OpenModeFlag.WriteOnly)
if not open_ok:
raise QtOSError(f)
@@ -259,7 +256,7 @@ def savefile_open(
raise QtOSError(f, msg="Commit failed!")
-def qcolor_to_qsscolor(c: QColor) -> str:
+def qcolor_to_qsscolor(c: gui.QColor) -> str:
"""Convert a QColor to a string that can be used in a QStyleSheet."""
ensure_valid(c)
return "rgba({}, {}, {}, {})".format(
@@ -274,7 +271,7 @@ class PyQIODevice(io.BufferedIOBase):
dev: The underlying QIODevice.
"""
- def __init__(self, dev: QIODevice) -> None:
+ def __init__(self, dev: core.QIODevice) -> None:
super().__init__()
self.dev = dev
@@ -304,7 +301,7 @@ class PyQIODevice(io.BufferedIOBase):
# contextlib.closing is only generic in Python 3.9+
def open(
self,
- mode: QIODevice.OpenModeFlag,
+ mode: core.QIODevice.OpenModeFlag,
) -> contextlib.closing: # type: ignore[type-arg]
"""Open the underlying device and ensure opening succeeded.
@@ -375,7 +372,7 @@ class PyQIODevice(io.BufferedIOBase):
else:
qt_size = size + 1 # Qt also counts the NUL byte
- buf: Union[QByteArray, bytes, None] = None
+ buf: Union[core.QByteArray, bytes, None] = None
if self.dev.canReadLine():
if qt_size is None:
buf = self.dev.readLine()
@@ -389,7 +386,7 @@ class PyQIODevice(io.BufferedIOBase):
if buf is None:
raise QtOSError(self.dev)
- if isinstance(buf, QByteArray):
+ if isinstance(buf, core.QByteArray):
# The type (bytes or QByteArray) seems to depend on what data we
# feed in...
buf = buf.data()
@@ -422,7 +419,7 @@ class PyQIODevice(io.BufferedIOBase):
self._check_open()
self._check_readable()
- buf: Union[QByteArray, bytes, None] = None
+ buf: Union[core.QByteArray, bytes, None] = None
if size in [None, -1]:
buf = self.dev.readAll()
else:
@@ -432,7 +429,7 @@ class PyQIODevice(io.BufferedIOBase):
if buf is None:
raise QtOSError(self.dev)
- if isinstance(buf, QByteArray):
+ if isinstance(buf, core.QByteArray):
# The type (bytes or QByteArray) seems to depend on what data we
# feed in...
buf = buf.data()
@@ -455,21 +452,21 @@ class QtValueError(ValueError):
super().__init__(err)
-class EventLoop(QEventLoop):
+class EventLoop(core.QEventLoop):
"""A thin wrapper around QEventLoop.
Raises an exception when doing exec() multiple times.
"""
- def __init__(self, parent: QObject = None) -> None:
+ def __init__(self, parent: core.QObject = None) -> None:
super().__init__(parent)
self._executing = False
def exec(
self,
- flags: QEventLoop.ProcessEventsFlag =
- QEventLoop.ProcessEventsFlag.AllEvents
+ flags: core.QEventLoop.ProcessEventsFlag =
+ core.QEventLoop.ProcessEventsFlag.AllEvents
) -> int:
"""Override exec_ to raise an exception when re-running."""
if self._executing:
@@ -505,11 +502,11 @@ def _get_color_percentage(x1: int, y1: int, z1: int, a1: int,
def interpolate_color(
- start: QColor,
- end: QColor,
+ start: gui.QColor,
+ end: gui.QColor,
percent: int,
- colorspace: Optional[QColor.Spec] = QColor.Spec.Rgb
-) -> QColor:
+ colorspace: Optional[gui.QColor.Spec] = gui.QColor.Spec.Rgb
+) -> gui.QColor:
"""Get an interpolated color value.
Args:
@@ -528,22 +525,22 @@ def interpolate_color(
if colorspace is None:
if percent == 100:
- return QColor(*end.getRgb())
+ return gui.QColor(*end.getRgb())
else:
- return QColor(*start.getRgb())
+ return gui.QColor(*start.getRgb())
- out = QColor()
- if colorspace == QColor.Spec.Rgb:
+ out = gui.QColor()
+ if colorspace == gui.QColor.Spec.Rgb:
r1, g1, b1, a1 = start.getRgb()
r2, g2, b2, a2 = end.getRgb()
components = _get_color_percentage(r1, g1, b1, a1, r2, g2, b2, a2, percent)
out.setRgb(*components)
- elif colorspace == QColor.Spec.Hsv:
+ elif colorspace == gui.QColor.Spec.Hsv:
h1, s1, v1, a1 = start.getHsv()
h2, s2, v2, a2 = end.getHsv()
components = _get_color_percentage(h1, s1, v1, a1, h2, s2, v2, a2, percent)
out.setHsv(*components)
- elif colorspace == QColor.Spec.Hsl:
+ elif colorspace == gui.QColor.Spec.Hsl:
h1, s1, l1, a1 = start.getHsl()
h2, s2, l2, a2 = end.getHsl()
components = _get_color_percentage(h1, s1, l1, a1, h2, s2, l2, a2, percent)
@@ -581,14 +578,14 @@ class LibraryPath(enum.Enum):
def library_path(which: LibraryPath) -> pathlib.Path:
"""Wrapper around QLibraryInfo.path / .location."""
- if hasattr(QLibraryInfo, "path"):
+ if hasattr(core.QLibraryInfo, "path"):
# Qt 6
- val = getattr(QLibraryInfo.LibraryPath, which.value)
- ret = QLibraryInfo.path(val)
+ val = getattr(core.QLibraryInfo.LibraryPath, which.value)
+ ret = core.QLibraryInfo.path(val)
else:
# Qt 5
- val = getattr(QLibraryInfo.LibraryLocation, which.value)
- ret = QLibraryInfo.location(val)
+ val = getattr(core.QLibraryInfo.LibraryLocation, which.value)
+ ret = core.QLibraryInfo.location(val)
assert ret
return pathlib.Path(ret)
diff --git a/qutebrowser/utils/standarddir.py b/qutebrowser/utils/standarddir.py
index e63b43548..cf9335d6e 100644
--- a/qutebrowser/utils/standarddir.py
+++ b/qutebrowser/utils/standarddir.py
@@ -27,8 +27,7 @@ import enum
import argparse
from typing import Iterator, Optional
-from qutebrowser.qt.core import QStandardPaths
-from qutebrowser.qt.widgets import QApplication
+from qutebrowser.qt import widgets, core
from qutebrowser.utils import log, debug, utils, version
@@ -64,7 +63,7 @@ def _unset_organization() -> Iterator[None]:
This is primarily needed in config.py.
"""
- qapp = QApplication.instance()
+ qapp = widgets.QApplication.instance()
if qapp is not None:
orgname = qapp.organizationName()
qapp.setOrganizationName(None) # type: ignore[arg-type]
@@ -77,12 +76,12 @@ def _unset_organization() -> Iterator[None]:
def _init_config(args: Optional[argparse.Namespace]) -> None:
"""Initialize the location for configs."""
- typ = QStandardPaths.StandardLocation.ConfigLocation
+ typ = core.QStandardPaths.StandardLocation.ConfigLocation
path = _from_args(typ, args)
if path is None:
if utils.is_windows:
app_data_path = _writable_location(
- QStandardPaths.StandardLocation.AppDataLocation)
+ core.QStandardPaths.StandardLocation.AppDataLocation)
path = os.path.join(app_data_path, 'config')
else:
path = _writable_location(typ)
@@ -128,7 +127,7 @@ def config_py() -> str:
def _init_data(args: Optional[argparse.Namespace]) -> None:
"""Initialize the location for data."""
- typ = QStandardPaths.StandardLocation.AppDataLocation
+ typ = core.QStandardPaths.StandardLocation.AppDataLocation
path = _from_args(typ, args)
if path is None:
if utils.is_windows:
@@ -136,7 +135,7 @@ def _init_data(args: Optional[argparse.Namespace]) -> None:
path = os.path.join(app_data_path, 'data')
elif sys.platform.startswith('haiku'):
# HaikuOS returns an empty value for AppDataLocation
- config_path = _writable_location(QStandardPaths.StandardLocation.ConfigLocation)
+ config_path = _writable_location(core.QStandardPaths.StandardLocation.ConfigLocation)
path = os.path.join(config_path, 'data')
else:
path = _writable_location(typ)
@@ -169,12 +168,12 @@ def data(system: bool = False) -> str:
def _init_cache(args: Optional[argparse.Namespace]) -> None:
"""Initialize the location for the cache."""
- typ = QStandardPaths.StandardLocation.CacheLocation
+ typ = core.QStandardPaths.StandardLocation.CacheLocation
path = _from_args(typ, args)
if path is None:
if utils.is_windows:
# Local, not Roaming!
- data_path = _writable_location(QStandardPaths.StandardLocation.AppLocalDataLocation)
+ data_path = _writable_location(core.QStandardPaths.StandardLocation.AppLocalDataLocation)
path = os.path.join(data_path, 'cache')
else:
path = _writable_location(typ)
@@ -193,7 +192,7 @@ def _init_download(args: Optional[argparse.Namespace]) -> None:
Note this is only the default directory as found by Qt.
Therefore, we also don't create it.
"""
- typ = QStandardPaths.StandardLocation.DownloadLocation
+ typ = core.QStandardPaths.StandardLocation.DownloadLocation
path = _from_args(typ, args)
if path is None:
path = _writable_location(typ)
@@ -208,9 +207,9 @@ def _init_runtime(args: Optional[argparse.Namespace]) -> None:
"""Initialize location for runtime data."""
if utils.is_mac or utils.is_windows:
# RuntimeLocation is a weird path on macOS and Windows.
- typ = QStandardPaths.StandardLocation.TempLocation
+ typ = core.QStandardPaths.StandardLocation.TempLocation
else:
- typ = QStandardPaths.StandardLocation.RuntimeLocation
+ typ = core.QStandardPaths.StandardLocation.RuntimeLocation
path = _from_args(typ, args)
if path is None:
@@ -218,10 +217,10 @@ def _init_runtime(args: Optional[argparse.Namespace]) -> None:
path = _writable_location(typ)
except EmptyValueError:
# Fall back to TempLocation when RuntimeLocation is misconfigured
- if typ == QStandardPaths.StandardLocation.TempLocation:
+ if typ == core.QStandardPaths.StandardLocation.TempLocation:
raise
path = _writable_location( # pragma: no cover
- QStandardPaths.StandardLocation.TempLocation)
+ core.QStandardPaths.StandardLocation.TempLocation)
# This is generic, but per-user.
# _writable_location makes sure we have a qutebrowser-specific subdir.
@@ -253,23 +252,23 @@ def runtime() -> str:
return _locations[_Location.runtime]
-def _writable_location(typ: QStandardPaths.StandardLocation) -> str:
+def _writable_location(typ: core.QStandardPaths.StandardLocation) -> str:
"""Wrapper around QStandardPaths.writableLocation.
Arguments:
typ: A QStandardPaths::StandardLocation member.
"""
- typ_str = debug.qenum_key(QStandardPaths, typ)
+ typ_str = debug.qenum_key(core.QStandardPaths, typ)
# Types we are sure we handle correctly below.
assert typ in [
- QStandardPaths.StandardLocation.ConfigLocation, QStandardPaths.StandardLocation.AppLocalDataLocation,
- QStandardPaths.StandardLocation.CacheLocation, QStandardPaths.StandardLocation.DownloadLocation,
- QStandardPaths.StandardLocation.RuntimeLocation, QStandardPaths.StandardLocation.TempLocation,
- QStandardPaths.StandardLocation.AppDataLocation], typ_str
+ core.QStandardPaths.StandardLocation.ConfigLocation, core.QStandardPaths.StandardLocation.AppLocalDataLocation,
+ core.QStandardPaths.StandardLocation.CacheLocation, core.QStandardPaths.StandardLocation.DownloadLocation,
+ core.QStandardPaths.StandardLocation.RuntimeLocation, core.QStandardPaths.StandardLocation.TempLocation,
+ core.QStandardPaths.StandardLocation.AppDataLocation], typ_str
with _unset_organization():
- path = QStandardPaths.writableLocation(typ)
+ path = core.QStandardPaths.writableLocation(typ)
log.misc.debug("writable location for {}: {}".format(typ_str, path))
if not path:
@@ -281,7 +280,7 @@ def _writable_location(typ: QStandardPaths.StandardLocation) -> str:
# Add the application name to the given path if needed.
# This is in order for this to work without a QApplication (and thus
# QStandardsPaths not knowing the application name).
- if (typ != QStandardPaths.StandardLocation.DownloadLocation and
+ if (typ != core.QStandardPaths.StandardLocation.DownloadLocation and
path.split(os.sep)[-1] != APPNAME):
path = os.path.join(path, APPNAME)
@@ -289,7 +288,7 @@ def _writable_location(typ: QStandardPaths.StandardLocation) -> str:
def _from_args(
- typ: QStandardPaths.StandardLocation,
+ typ: core.QStandardPaths.StandardLocation,
args: Optional[argparse.Namespace]
) -> Optional[str]:
"""Get the standard directory from an argparse namespace.
@@ -298,12 +297,12 @@ def _from_args(
The overridden path, or None if there is no override.
"""
basedir_suffix = {
- QStandardPaths.StandardLocation.ConfigLocation: 'config',
- QStandardPaths.StandardLocation.AppDataLocation: 'data',
- QStandardPaths.StandardLocation.AppLocalDataLocation: 'data',
- QStandardPaths.StandardLocation.CacheLocation: 'cache',
- QStandardPaths.StandardLocation.DownloadLocation: 'download',
- QStandardPaths.StandardLocation.RuntimeLocation: 'runtime',
+ core.QStandardPaths.StandardLocation.ConfigLocation: 'config',
+ core.QStandardPaths.StandardLocation.AppDataLocation: 'data',
+ core.QStandardPaths.StandardLocation.AppLocalDataLocation: 'data',
+ core.QStandardPaths.StandardLocation.CacheLocation: 'cache',
+ core.QStandardPaths.StandardLocation.DownloadLocation: 'download',
+ core.QStandardPaths.StandardLocation.RuntimeLocation: 'runtime',
}
if getattr(args, 'basedir', None) is None:
diff --git a/qutebrowser/utils/urlmatch.py b/qutebrowser/utils/urlmatch.py
index 81127d986..1955de08b 100644
--- a/qutebrowser/utils/urlmatch.py
+++ b/qutebrowser/utils/urlmatch.py
@@ -34,7 +34,7 @@ import fnmatch
import urllib.parse
from typing import Any, Optional, Tuple
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import core
from qutebrowser.utils import utils, qtutils
@@ -196,7 +196,7 @@ class UrlPattern:
if parsed.netloc.startswith('['):
# Using QUrl parsing to minimize ipv6 addresses
- url = QUrl()
+ url = core.QUrl()
url.setHost(parsed.hostname)
if not url.isValid():
raise ParseError(url.errorString())
@@ -309,7 +309,7 @@ class UrlPattern:
# doesn't rely on regexes. Do we need that too?
return fnmatch.fnmatchcase(path, self._path)
- def matches(self, qurl: QUrl) -> bool:
+ def matches(self, qurl: core.QUrl) -> bool:
"""Check if the pattern matches the given QUrl."""
qtutils.ensure_valid(qurl)
diff --git a/qutebrowser/utils/urlutils.py b/qutebrowser/utils/urlutils.py
index 58862925e..c652d29f7 100644
--- a/qutebrowser/utils/urlutils.py
+++ b/qutebrowser/utils/urlutils.py
@@ -28,8 +28,7 @@ import urllib.parse
import mimetypes
from typing import Optional, Tuple, Union, Iterable
-from qutebrowser.qt.core import QUrl
-from qutebrowser.qt.network import QHostInfo, QHostAddress, QNetworkProxy
+from qutebrowser.qt import network, core
from qutebrowser.api import cmdutils
from qutebrowser.config import config
@@ -65,7 +64,7 @@ class InvalidUrlError(Error):
"""Error raised if a function got an invalid URL."""
- def __init__(self, url: QUrl) -> None:
+ def __init__(self, url: core.QUrl) -> None:
if url.isValid():
raise ValueError("Got valid URL {}!".format(url.toDisplayString()))
self.url = url
@@ -107,7 +106,7 @@ def _parse_search_term(s: str) -> Tuple[Optional[str], Optional[str]]:
return (engine, term)
-def _get_search_url(txt: str) -> QUrl:
+def _get_search_url(txt: str) -> core.QUrl:
"""Get a search engine URL for a text.
Args:
@@ -128,9 +127,9 @@ def _get_search_url(txt: str) -> QUrl:
unquoted=term,
quoted=quoted_term,
semiquoted=semiquoted_term)
- url = QUrl.fromUserInput(evaluated)
+ url = core.QUrl.fromUserInput(evaluated)
else:
- url = QUrl.fromUserInput(config.val.url.searchengines[engine])
+ url = core.QUrl.fromUserInput(config.val.url.searchengines[engine])
url.setPath(None) # type: ignore[arg-type]
url.setFragment(None) # type: ignore[arg-type]
url.setQuery(None) # type: ignore[call-overload]
@@ -147,7 +146,7 @@ def _is_url_naive(urlstr: str) -> bool:
Return:
True if the URL really is a URL, False otherwise.
"""
- url = QUrl.fromUserInput(urlstr)
+ url = core.QUrl.fromUserInput(urlstr)
assert url.isValid()
host = url.host()
@@ -172,11 +171,11 @@ def _is_url_dns(urlstr: str) -> bool:
Return:
True if the URL really is a URL, False otherwise.
"""
- url = QUrl.fromUserInput(urlstr)
+ url = core.QUrl.fromUserInput(urlstr)
assert url.isValid()
if (utils.raises(ValueError, ipaddress.ip_address, urlstr) and
- not QHostAddress(urlstr).isNull()):
+ not network.QHostAddress(urlstr).isNull()):
log.url.debug("Bogus IP URL -> False")
# Qt treats things like "23.42" or "1337" or "0xDEAD" as valid URLs
# which we don't want to.
@@ -187,7 +186,7 @@ def _is_url_dns(urlstr: str) -> bool:
log.url.debug("URL has no host -> False")
return False
log.url.debug("Doing DNS request for {}".format(host))
- info = QHostInfo.fromName(host)
+ info = network.QHostInfo.fromName(host)
return not info.error()
@@ -195,7 +194,7 @@ def fuzzy_url(urlstr: str,
cwd: str = None,
relative: bool = False,
do_search: bool = True,
- force_search: bool = False) -> QUrl:
+ force_search: bool = False) -> core.QUrl:
"""Get a QUrl based on a user input which is URL or search term.
Args:
@@ -214,24 +213,24 @@ def fuzzy_url(urlstr: str,
check_exists=True)
if not force_search and path is not None:
- url = QUrl.fromLocalFile(path)
+ url = core.QUrl.fromLocalFile(path)
elif force_search or (do_search and not is_url(urlstr)):
# probably a search term
log.url.debug("URL is a fuzzy search term")
try:
url = _get_search_url(urlstr)
except ValueError: # invalid search engine
- url = QUrl.fromUserInput(urlstr)
+ url = core.QUrl.fromUserInput(urlstr)
else: # probably an address
log.url.debug("URL is a fuzzy address")
- url = QUrl.fromUserInput(urlstr)
+ url = core.QUrl.fromUserInput(urlstr)
log.url.debug("Converting fuzzy term {!r} to URL -> {}".format(
urlstr, url.toDisplayString()))
ensure_valid(url)
return url
-def _has_explicit_scheme(url: QUrl) -> bool:
+def _has_explicit_scheme(url: core.QUrl) -> bool:
"""Check if a url has an explicit scheme given.
Args:
@@ -246,7 +245,7 @@ def _has_explicit_scheme(url: QUrl) -> bool:
not url.path().startswith(':'))
-def is_special_url(url: QUrl) -> bool:
+def is_special_url(url: core.QUrl) -> bool:
"""Return True if url is an about:... or other special URL.
Args:
@@ -273,8 +272,8 @@ def is_url(urlstr: str) -> bool:
urlstr, autosearch))
urlstr = urlstr.strip()
- qurl = QUrl(urlstr)
- qurl_userinput = QUrl.fromUserInput(urlstr)
+ qurl = core.QUrl(urlstr)
+ qurl_userinput = core.QUrl.fromUserInput(urlstr)
if autosearch == 'never':
# no autosearch, so everything is a URL unless it has an explicit
@@ -320,12 +319,12 @@ def is_url(urlstr: str) -> bool:
return url
-def ensure_valid(url: QUrl) -> None:
+def ensure_valid(url: core.QUrl) -> None:
if not url.isValid():
raise InvalidUrlError(url)
-def invalid_url_error(url: QUrl, action: str) -> None:
+def invalid_url_error(url: core.QUrl, action: str) -> None:
"""Display an error message for a URL.
Args:
@@ -340,7 +339,7 @@ def invalid_url_error(url: QUrl, action: str) -> None:
message.error(errstring)
-def raise_cmdexc_if_invalid(url: QUrl) -> None:
+def raise_cmdexc_if_invalid(url: core.QUrl) -> None:
"""Check if the given QUrl is invalid, and if so, raise a CommandError."""
try:
ensure_valid(url)
@@ -396,7 +395,7 @@ def get_path_if_valid(pathstr: str,
return path
-def filename_from_url(url: QUrl, fallback: str = None) -> Optional[str]:
+def filename_from_url(url: core.QUrl, fallback: str = None) -> Optional[str]:
"""Get a suitable filename from a URL.
Args:
@@ -429,7 +428,7 @@ def filename_from_url(url: QUrl, fallback: str = None) -> Optional[str]:
HostTupleType = Tuple[str, str, int]
-def host_tuple(url: QUrl) -> HostTupleType:
+def host_tuple(url: core.QUrl) -> HostTupleType:
"""Get a (scheme, host, port) tuple from a QUrl.
This is suitable to identify a connection, e.g. for SSL errors.
@@ -454,7 +453,7 @@ def host_tuple(url: QUrl) -> HostTupleType:
return scheme, host, port
-def get_errstring(url: QUrl, base: str = "Invalid URL") -> str:
+def get_errstring(url: core.QUrl, base: str = "Invalid URL") -> str:
"""Get an error string for a URL.
Args:
@@ -471,7 +470,7 @@ def get_errstring(url: QUrl, base: str = "Invalid URL") -> str:
return base
-def same_domain(url1: QUrl, url2: QUrl) -> bool:
+def same_domain(url1: core.QUrl, url2: core.QUrl) -> bool:
"""Check if url1 and url2 belong to the same website.
This will use a "public suffix list" to determine what a "top level domain"
@@ -519,7 +518,7 @@ def same_domain(url1: QUrl, url2: QUrl) -> bool:
return domain1 == domain2
-def encoded_url(url: QUrl) -> str:
+def encoded_url(url: core.QUrl) -> str:
"""Return the fully encoded url as string.
Args:
@@ -534,19 +533,19 @@ def file_url(path: str) -> str:
Arguments:
path: The absolute path to the local file
"""
- url = QUrl.fromLocalFile(path)
- return url.toString(QUrl.ComponentFormattingOption.FullyEncoded) # type: ignore[arg-type]
+ url = core.QUrl.fromLocalFile(path)
+ return url.toString(core.QUrl.ComponentFormattingOption.FullyEncoded) # type: ignore[arg-type]
-def data_url(mimetype: str, data: bytes) -> QUrl:
+def data_url(mimetype: str, data: bytes) -> core.QUrl:
"""Get a data: QUrl for the given data."""
b64 = base64.b64encode(data).decode('ascii')
- url = QUrl('data:{};base64,{}'.format(mimetype, b64))
+ url = core.QUrl('data:{};base64,{}'.format(mimetype, b64))
qtutils.ensure_valid(url)
return url
-def safe_display_string(qurl: QUrl) -> str:
+def safe_display_string(qurl: core.QUrl) -> str:
"""Get a IDN-homograph phishing safe form of the given QUrl.
If we're dealing with a Punycode-encoded URL, this prepends the hostname in
@@ -557,11 +556,11 @@ def safe_display_string(qurl: QUrl) -> str:
"""
ensure_valid(qurl)
- host = qurl.host(QUrl.ComponentFormattingOption.FullyEncoded)
+ host = qurl.host(core.QUrl.ComponentFormattingOption.FullyEncoded)
assert '..' not in host, qurl # https://bugreports.qt.io/browse/QTBUG-60364
for part in host.split('.'):
- url_host = qurl.host(QUrl.ComponentFormattingOption.FullyDecoded)
+ url_host = qurl.host(core.QUrl.ComponentFormattingOption.FullyDecoded)
if part.startswith('xn--') and host != url_host:
return '({}) {}'.format(host, qurl.toDisplayString())
@@ -576,7 +575,7 @@ class InvalidProxyTypeError(Exception):
super().__init__("Invalid proxy type {}!".format(typ))
-def proxy_from_url(url: QUrl) -> Union[QNetworkProxy, pac.PACFetcher]:
+def proxy_from_url(url: core.QUrl) -> Union[network.QNetworkProxy, pac.PACFetcher]:
"""Create a QNetworkProxy from QUrl and a proxy type.
Args:
@@ -594,15 +593,15 @@ def proxy_from_url(url: QUrl) -> Union[QNetworkProxy, pac.PACFetcher]:
return fetcher
types = {
- 'http': QNetworkProxy.ProxyType.HttpProxy,
- 'socks': QNetworkProxy.ProxyType.Socks5Proxy,
- 'socks5': QNetworkProxy.ProxyType.Socks5Proxy,
- 'direct': QNetworkProxy.ProxyType.NoProxy,
+ 'http': network.QNetworkProxy.ProxyType.HttpProxy,
+ 'socks': network.QNetworkProxy.ProxyType.Socks5Proxy,
+ 'socks5': network.QNetworkProxy.ProxyType.Socks5Proxy,
+ 'direct': network.QNetworkProxy.ProxyType.NoProxy,
}
if scheme not in types:
raise InvalidProxyTypeError(scheme)
- proxy = QNetworkProxy(types[scheme], url.host())
+ proxy = network.QNetworkProxy(types[scheme], url.host())
if url.port() != -1:
proxy.setPort(url.port())
@@ -613,7 +612,7 @@ def proxy_from_url(url: QUrl) -> Union[QNetworkProxy, pac.PACFetcher]:
return proxy
-def parse_javascript_url(url: QUrl) -> str:
+def parse_javascript_url(url: core.QUrl) -> str:
"""Get JavaScript source from the given URL.
See https://wiki.whatwg.org/wiki/URL_schemes#javascript:_URLs
@@ -626,7 +625,7 @@ def parse_javascript_url(url: QUrl) -> str:
raise Error("URL contains unexpected components: {}"
.format(url.authority()))
- urlstr = url.toString(QUrl.ComponentFormattingOption.FullyEncoded) # type: ignore[arg-type]
+ urlstr = url.toString(core.QUrl.ComponentFormattingOption.FullyEncoded) # type: ignore[arg-type]
urlstr = urllib.parse.unquote(urlstr)
code = urlstr[len('javascript:'):]
diff --git a/qutebrowser/utils/usertypes.py b/qutebrowser/utils/usertypes.py
index b84af4524..b2e748ac7 100644
--- a/qutebrowser/utils/usertypes.py
+++ b/qutebrowser/utils/usertypes.py
@@ -24,9 +24,7 @@ import operator
import enum
import dataclasses
from typing import Optional, Sequence, TypeVar, Union
-
-from qutebrowser.qt.core import pyqtSignal, pyqtSlot, QObject, QTimer
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import core
from qutebrowser.utils import log, qtutils, utils
@@ -358,7 +356,7 @@ class CommandValue(enum.Enum):
count_tab = enum.auto()
-class Question(QObject):
+class Question(core.QObject):
"""A question asked to the user, e.g. via the status bar.
@@ -396,14 +394,14 @@ class Question(QObject):
completed: Emitted when the question was completed in any way.
"""
- answered = pyqtSignal(object)
- cancelled = pyqtSignal()
- aborted = pyqtSignal()
- answered_yes = pyqtSignal()
- answered_no = pyqtSignal()
- completed = pyqtSignal()
+ answered = core.pyqtSignal(object)
+ cancelled = core.pyqtSignal()
+ aborted = core.pyqtSignal()
+ answered_yes = core.pyqtSignal()
+ answered_no = core.pyqtSignal()
+ completed = core.pyqtSignal()
- def __init__(self, parent: QObject = None) -> None:
+ def __init__(self, parent: core.QObject = None) -> None:
super().__init__(parent)
self.mode: Optional[PromptMode] = None
self.default: Union[bool, str, None] = None
@@ -420,7 +418,7 @@ class Question(QObject):
mode=self.mode, default=self.default,
option=self.option)
- @pyqtSlot()
+ @core.pyqtSlot()
def done(self) -> None:
"""Must be called when the question was answered completely."""
self.answered.emit(self.answer)
@@ -431,13 +429,13 @@ class Question(QObject):
self.answered_no.emit()
self.completed.emit()
- @pyqtSlot()
+ @core.pyqtSlot()
def cancel(self) -> None:
"""Cancel the question (resulting from user-input)."""
self.cancelled.emit()
self.completed.emit()
- @pyqtSlot()
+ @core.pyqtSlot()
def abort(self) -> None:
"""Abort the question."""
if self.is_aborted:
@@ -448,7 +446,7 @@ class Question(QObject):
self.completed.emit()
-class Timer(QTimer):
+class Timer(core.QTimer):
"""A timer which has a name to show in __repr__ and checks for overflows.
@@ -456,7 +454,7 @@ class Timer(QTimer):
_name: The name of the timer.
"""
- def __init__(self, parent: QObject = None, name: str = None) -> None:
+ def __init__(self, parent: core.QObject = None, name: str = None) -> None:
super().__init__(parent)
if name is None:
self._name = "unnamed"
@@ -553,7 +551,7 @@ class NavigationRequest:
#: None of the above.
other = 8
- url: QUrl
+ url: core.QUrl
navigation_type: Type
is_main_frame: bool
accepted: bool = True
diff --git a/qutebrowser/utils/utils.py b/qutebrowser/utils/utils.py
index 29c4be1d9..1fd12b815 100644
--- a/qutebrowser/utils/utils.py
+++ b/qutebrowser/utils/utils.py
@@ -43,10 +43,7 @@ except ImportError: # pragma: no cover
class Protocol:
"""Empty stub at runtime."""
-
-from qutebrowser.qt.core import QUrl, QVersionNumber, QRect, QPoint
-from qutebrowser.qt.gui import QClipboard, QDesktopServices
-from qutebrowser.qt.widgets import QApplication
+from qutebrowser.qt import widgets
import yaml
try:
@@ -59,6 +56,7 @@ except ImportError: # pragma: no cover
YAML_C_EXT = False
from qutebrowser.utils import log
+from qutebrowser.qt import gui, core
fake_clipboard = None
log_clipboard = False
@@ -87,7 +85,7 @@ class VersionNumber:
"""A representation of a version number."""
def __init__(self, *args: int) -> None:
- self._ver = QVersionNumber(args) # not *args, to support >3 components
+ self._ver = core.QVersionNumber(args) # not *args, to support >3 components
if self._ver.isNull():
raise ValueError("Can't construct a null version")
@@ -116,7 +114,7 @@ class VersionNumber:
@classmethod
def parse(cls, s: str) -> 'VersionNumber':
"""Parse a version number from a string."""
- ver, _suffix = QVersionNumber.fromString(s)
+ ver, _suffix = core.QVersionNumber.fromString(s)
# FIXME: Should we support a suffix?
if ver.isNull():
@@ -535,8 +533,8 @@ def set_clipboard(data: str, selection: bool = False) -> None:
log.misc.debug("Setting fake {}: {}".format(what, json.dumps(data)))
fake_clipboard = data
else:
- mode = QClipboard.Mode.Selection if selection else QClipboard.Mode.Clipboard
- QApplication.clipboard().setText(data, mode=mode)
+ mode = gui.QClipboard.Mode.Selection if selection else gui.QClipboard.Mode.Clipboard
+ widgets.QApplication.clipboard().setText(data, mode=mode)
def get_clipboard(selection: bool = False, fallback: bool = False) -> str:
@@ -561,8 +559,8 @@ def get_clipboard(selection: bool = False, fallback: bool = False) -> str:
data = fake_clipboard
fake_clipboard = None
else:
- mode = QClipboard.Mode.Selection if selection else QClipboard.Mode.Clipboard
- data = QApplication.clipboard().text(mode=mode)
+ mode = gui.QClipboard.Mode.Selection if selection else gui.QClipboard.Mode.Clipboard
+ data = widgets.QApplication.clipboard().text(mode=mode)
target = "Primary selection" if selection else "Clipboard"
if not data.strip():
@@ -574,7 +572,7 @@ def get_clipboard(selection: bool = False, fallback: bool = False) -> str:
def supports_selection() -> bool:
"""Check if the OS supports primary selection."""
- return QApplication.clipboard().supportsSelection()
+ return widgets.QApplication.clipboard().supportsSelection()
def open_file(filename: str, cmdline: str = None) -> None:
@@ -616,8 +614,8 @@ def open_file(filename: str, cmdline: str = None) -> None:
if cmdline is None and not override:
log.misc.debug("Opening {} with the system application"
.format(filename))
- url = QUrl.fromLocalFile(filename)
- QDesktopServices.openUrl(url)
+ url = core.QUrl.fromLocalFile(filename)
+ gui.QDesktopServices.openUrl(url)
return
if cmdline is None and override:
@@ -816,7 +814,7 @@ def cleanup_file(filepath: str) -> Iterator[None]:
_RECT_PATTERN = re.compile(r'(?P<w>\d+)x(?P<h>\d+)\+(?P<x>\d+)\+(?P<y>\d+)')
-def parse_rect(s: str) -> QRect:
+def parse_rect(s: str) -> core.QRect:
"""Parse a rectangle string like 20x20+5+3.
Negative offsets aren't supported, and neither is leaving off parts of the string.
@@ -831,7 +829,7 @@ def parse_rect(s: str) -> QRect:
y = int(match.group('y'))
try:
- rect = QRect(x, y, w, h)
+ rect = core.QRect(x, y, w, h)
except OverflowError as e:
raise ValueError(e)
@@ -841,7 +839,7 @@ def parse_rect(s: str) -> QRect:
return rect
-def parse_point(s: str) -> QPoint:
+def parse_point(s: str) -> core.QPoint:
"""Parse a point string like 13,-42."""
try:
x, y = map(int, s.split(',', maxsplit=1))
@@ -849,6 +847,6 @@ def parse_point(s: str) -> QPoint:
raise ValueError(f"String {s} does not match X,Y")
try:
- return QPoint(x, y)
+ return core.QPoint(x, y)
except OverflowError as e:
raise ValueError(e)
diff --git a/qutebrowser/utils/version.py b/qutebrowser/utils/version.py
index e301be5b6..efd7fc68d 100644
--- a/qutebrowser/utils/version.py
+++ b/qutebrowser/utils/version.py
@@ -36,19 +36,14 @@ import dataclasses
from typing import (Mapping, Optional, Sequence, Tuple, ClassVar, Dict, cast,
TYPE_CHECKING)
-from qutebrowser.qt import machinery
-from qutebrowser.qt.core import PYQT_VERSION_STR
-from qutebrowser.qt.network import QSslSocket
-from qutebrowser.qt.gui import QOpenGLContext, QOffscreenSurface
-from qutebrowser.qt.opengl import QOpenGLVersionProfile
-from qutebrowser.qt.widgets import QApplication
+from qutebrowser.qt import opengl, widgets, webkit, webenginecore, network, gui, core, machinery
try:
- from qutebrowser.qt.webkit import qWebKitVersion
+ pass
except ImportError: # pragma: no cover
qWebKitVersion = None # type: ignore[assignment] # noqa: N816
try:
- from qutebrowser.qt.webenginecore import PYQT_WEBENGINE_VERSION_STR
+ pass
except ImportError: # pragma: no cover
# QtWebKit
PYQT_WEBENGINE_VERSION_STR = None # type: ignore[assignment]
@@ -780,16 +775,13 @@ def qtwebengine_versions(*, avoid_init: bool = False) -> WebEngineVersions:
return WebEngineVersions.from_pyqt(override, source='override')
try:
- from qutebrowser.qt.webenginecore import (
- qWebEngineVersion,
- qWebEngineChromiumVersion,
- )
+ pass
except ImportError:
pass # Needs QtWebEngine 6.2+ with PyQtWebEngine 6.3.1+
else:
return WebEngineVersions.from_api(
- qtwe_version=qWebEngineVersion(),
- chromium_version=qWebEngineChromiumVersion(),
+ qtwe_version=webenginecore.qWebEngineVersion(),
+ chromium_version=webenginecore.qWebEngineChromiumVersion(),
)
from qutebrowser.browser.webengine import webenginesettings
@@ -809,14 +801,14 @@ def qtwebengine_versions(*, avoid_init: bool = False) -> WebEngineVersions:
return WebEngineVersions.from_webengine(
pyqt_webengine_qt_version, source='importlib')
- assert PYQT_WEBENGINE_VERSION_STR is not None
- return WebEngineVersions.from_pyqt(PYQT_WEBENGINE_VERSION_STR)
+ assert webenginecore.PYQT_WEBENGINE_VERSION_STR is not None
+ return WebEngineVersions.from_pyqt(webenginecore.PYQT_WEBENGINE_VERSION_STR)
def _backend() -> str:
"""Get the backend line with relevant information."""
if objects.backend == usertypes.Backend.QtWebKit:
- return 'new QtWebKit (WebKit {})'.format(qWebKitVersion())
+ return 'new QtWebKit (WebKit {})'.format(webkit.qWebKitVersion())
elif objects.backend == usertypes.Backend.QtWebEngine:
return str(qtwebengine_versions(
avoid_init='avoid-chromium-init' in objects.debug_flags))
@@ -857,7 +849,7 @@ def version_info() -> str:
'',
'{}: {}'.format(platform.python_implementation(),
platform.python_version()),
- 'PyQt: {}'.format(PYQT_VERSION_STR),
+ 'PyQt: {}'.format(core.PYQT_VERSION_STR),
'',
]
@@ -866,8 +858,8 @@ def version_info() -> str:
lines += [
'pdf.js: {}'.format(_pdfjs_version()),
'sqlite: {}'.format(sql.version()),
- 'QtNetwork SSL: {}\n'.format(QSslSocket.sslLibraryVersionString()
- if QSslSocket.supportsSsl() else 'no'),
+ 'QtNetwork SSL: {}\n'.format(network.QSslSocket.sslLibraryVersionString()
+ if network.QSslSocket.supportsSsl() else 'no'),
]
if objects.qapp:
@@ -983,7 +975,7 @@ def opengl_info() -> Optional[OpenGLInfo]: # pragma: no cover
'Intel Open Source Technology Center'; or None if the vendor can't be
determined.
"""
- assert QApplication.instance()
+ assert widgets.QApplication.instance()
override = os.environ.get('QUTE_FAKE_OPENGL')
if override is not None:
@@ -991,13 +983,13 @@ def opengl_info() -> Optional[OpenGLInfo]: # pragma: no cover
vendor, version = override.split(', ', maxsplit=1)
return OpenGLInfo.parse(vendor=vendor, version=version)
- old_context = cast(Optional[QOpenGLContext], QOpenGLContext.currentContext())
+ old_context = cast(Optional[gui.QOpenGLContext], gui.QOpenGLContext.currentContext())
old_surface = None if old_context is None else old_context.surface()
- surface = QOffscreenSurface()
+ surface = gui.QOffscreenSurface()
surface.create()
- ctx = QOpenGLContext()
+ ctx = gui.QOpenGLContext()
ok = ctx.create()
if not ok:
log.init.debug("Creating context failed!")
@@ -1013,7 +1005,7 @@ def opengl_info() -> Optional[OpenGLInfo]: # pragma: no cover
# Can't use versionFunctions there
return OpenGLInfo(gles=True)
- vp = QOpenGLVersionProfile()
+ vp = opengl.QOpenGLVersionProfile()
vp.setVersion(2, 0)
try:
@@ -1021,11 +1013,7 @@ def opengl_info() -> Optional[OpenGLInfo]: # pragma: no cover
# Qt 5
vf = ctx.versionFunctions(vp)
except AttributeError:
- # Qt 6
- # FIXME:qt6 (lint)
- # pylint: disable-next=no-name-in-module
- from qutebrowser.qt.opengl import QOpenGLVersionFunctionsFactory
- vf = QOpenGLVersionFunctionsFactory.get(vp, ctx)
+ vf = opengl.QOpenGLVersionFunctionsFactory.get(vp, ctx)
except ImportError as e:
log.init.debug("Importing version functions failed: {}".format(e))
return None
@@ -1068,7 +1056,7 @@ def pastebin_version(pbclient: pastebin.PastebinClient = None) -> None:
_yank_url(pastebin_url)
return
- app = QApplication.instance()
+ app = widgets.QApplication.instance()
http_client = httpclient.HTTPClient()
misc_api = pastebin.PastebinClient.MISC_API_URL
diff --git a/tests/conftest.py b/tests/conftest.py
index 48e5660ee..8d11c154a 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -261,9 +261,9 @@ def _select_backend(config):
# Fail early if selected backend is not available
# pylint: disable=unused-import
if backend == 'webkit':
- import qutebrowser.qt.webkitwidgets
+ import qutebrowser.qt
elif backend == 'webengine':
- import qutebrowser.qt.webenginewidgets
+ import qutebrowser.qt
else:
raise utils.Unreachable(backend)
@@ -274,12 +274,12 @@ def _auto_select_backend():
# pylint: disable=unused-import
try:
# Try to use QtWebKit as the default backend
- import qutebrowser.qt.webkitwidgets
+ import qutebrowser.qt
return 'webkit'
except ImportError:
# Try to use QtWebEngine as a fallback and fail early
# if that's also not available
- import qutebrowser.qt.webenginewidgets
+ import qutebrowser.qt
return 'webengine'
diff --git a/tests/end2end/conftest.py b/tests/end2end/conftest.py
index bdc172857..634c23480 100644
--- a/tests/end2end/conftest.py
+++ b/tests/end2end/conftest.py
@@ -27,7 +27,6 @@ import pstats
import operator
import pytest
-from qutebrowser.qt.core import PYQT_VERSION, QCoreApplication
pytest.register_assert_rewrite('end2end.fixtures')
@@ -39,6 +38,7 @@ from end2end.fixtures.quteprocess import (quteproc_process, quteproc,
from end2end.fixtures.testprocess import pytest_runtest_makereport
# pylint: enable=unused-import
from qutebrowser.utils import qtutils, utils
+from qutebrowser.qt import webenginecore, core
def pytest_configure(config):
@@ -111,7 +111,7 @@ def _get_version_tag(tag):
return pytest.mark.skipif(
not _check_version(
op_str=match.group('operator'),
- running_version=PYQT_VERSION,
+ running_version=core.PYQT_VERSION,
version_str=version,
as_hex=True,
),
@@ -119,12 +119,12 @@ def _get_version_tag(tag):
)
elif package == 'pyqtwebengine':
try:
- from qutebrowser.qt.webenginecore import PYQT_WEBENGINE_VERSION
+ pass
except ImportError:
# QtWebKit
- running_version = PYQT_VERSION
+ running_version = core.PYQT_VERSION
else:
- running_version = PYQT_WEBENGINE_VERSION
+ running_version = webenginecore.PYQT_WEBENGINE_VERSION
return pytest.mark.skipif(
not _check_version(
op_str=match.group('operator'),
@@ -179,7 +179,7 @@ if not getattr(sys, 'frozen', False):
def pytest_collection_modifyitems(config, items):
"""Apply @qtwebengine_* markers."""
- lib_path = pathlib.Path(QCoreApplication.libraryPaths()[0])
+ lib_path = pathlib.Path(core.QCoreApplication.libraryPaths()[0])
qpdf_image_plugin = lib_path / 'imageformats' / 'libqpdf.so'
markers = [
diff --git a/tests/end2end/features/test_downloads_bdd.py b/tests/end2end/features/test_downloads_bdd.py
index f19133d35..5dca5bee0 100644
--- a/tests/end2end/features/test_downloads_bdd.py
+++ b/tests/end2end/features/test_downloads_bdd.py
@@ -23,7 +23,7 @@ import shlex
import pytest
import pytest_bdd as bdd
-from qutebrowser.qt.network import QSslSocket
+from qutebrowser.qt import network
bdd.scenarios('downloads.feature')
@@ -65,7 +65,7 @@ def clean_old_downloads(quteproc):
@bdd.when("SSL is supported")
def check_ssl():
- if not QSslSocket.supportsSsl():
+ if not network.QSslSocket.supportsSsl():
pytest.skip("QtNetwork SSL not supported")
diff --git a/tests/end2end/features/test_editor_bdd.py b/tests/end2end/features/test_editor_bdd.py
index d09f888e3..7d69f5f9e 100644
--- a/tests/end2end/features/test_editor_bdd.py
+++ b/tests/end2end/features/test_editor_bdd.py
@@ -26,10 +26,10 @@ import time
import pytest
import pytest_bdd as bdd
-from qutebrowser.qt.core import pyqtSignal, pyqtSlot, QObject, QFileSystemWatcher
bdd.scenarios('editor.feature')
from qutebrowser.utils import utils
+from qutebrowser.qt import core
@bdd.when(bdd.parsers.parse('I setup a fake editor replacing "{text}" by '
@@ -73,20 +73,20 @@ def set_up_editor_empty(quteproc, tmpdir):
set_up_editor(quteproc, tmpdir, "")
-class EditorPidWatcher(QObject):
+class EditorPidWatcher(core.QObject):
- appeared = pyqtSignal()
+ appeared = core.pyqtSignal()
def __init__(self, directory, parent=None):
super().__init__(parent)
self._pidfile = directory / 'editor_pid'
- self._watcher = QFileSystemWatcher(self)
+ self._watcher = core.QFileSystemWatcher(self)
self._watcher.addPath(str(directory))
self._watcher.directoryChanged.connect(self._check_update)
self.has_pidfile = False
self._check_update()
- @pyqtSlot()
+ @core.pyqtSlot()
def _check_update(self):
if self.has_pidfile:
return
diff --git a/tests/end2end/fixtures/notificationserver.py b/tests/end2end/fixtures/notificationserver.py
index 5fafc8c05..eebe4ffb4 100644
--- a/tests/end2end/fixtures/notificationserver.py
+++ b/tests/end2end/fixtures/notificationserver.py
@@ -20,15 +20,13 @@
import dataclasses
import itertools
from typing import Dict, List
-
-from qutebrowser.qt.core import QObject, QByteArray, QUrl, pyqtSlot
-from qutebrowser.qt.gui import QImage
-from qutebrowser.qt.dbus import QDBusConnection, QDBusMessage
+from qutebrowser.qt import gui
import pytest
from qutebrowser.browser.webengine import notification
from qutebrowser.utils import utils
from tests.helpers import testutils
+from qutebrowser.qt import dbus, core
@dataclasses.dataclass
@@ -42,7 +40,7 @@ class NotificationProperties:
closed_via_web: bool = False
-class TestNotificationServer(QObject):
+class TestNotificationServer(core.QObject):
"""A libnotify notification server used for testing."""
def __init__(self, service: str):
@@ -55,7 +53,7 @@ class TestNotificationServer(QObject):
super().__init__()
self._service = service
# Trying to connect to the bus doesn't fail if there's no bus.
- self._bus = QDBusConnection.sessionBus()
+ self._bus = dbus.QDBusConnection.sessionBus()
self._message_id_gen = itertools.count(1)
# A dict mapping notification IDs to currently-displayed notifications.
self.messages: Dict[int, NotificationProperties] = {}
@@ -82,7 +80,7 @@ class TestNotificationServer(QObject):
notification.DBusNotificationAdapter.PATH,
notification.DBusNotificationAdapter.INTERFACE,
self,
- QDBusConnection.RegisterOption.ExportAllSlots,
+ dbus.QDBusConnection.RegisterOption.ExportAllSlots,
)
return True
@@ -110,7 +108,7 @@ class TestNotificationServer(QObject):
}
for key in 'x-qutebrowser-origin', 'x-kde-origin-name':
value = hints[key]
- url = QUrl(value)
+ url = core.QUrl(value)
assert url.isValid(), value
assert url.scheme() == 'http', value
assert url.host() == 'localhost', value
@@ -133,8 +131,8 @@ class TestNotificationServer(QObject):
has_alpha: bool,
bits_per_color: int,
channel_count: int,
- data: QByteArray,
- ) -> QImage:
+ data: core.QByteArray,
+ ) -> gui.QImage:
"""Make sure the given image data is valid and return a QImage."""
# Chromium limit?
assert 0 < width <= 320
@@ -151,8 +149,8 @@ class TestNotificationServer(QObject):
assert channel_count == (4 if has_alpha else 3)
assert bytes_per_line >= width * channel_count
- qimage_format = QImage.Format.Format_RGBA8888 if has_alpha else QImage.Format.Format_RGB888
- img = QImage(data, width, height, bytes_per_line, qimage_format)
+ qimage_format = gui.QImage.Format.Format_RGBA8888 if has_alpha else gui.QImage.Format.Format_RGB888
+ img = gui.QImage(data, width, height, bytes_per_line, qimage_format)
assert not img.isNull()
assert img.width() == width
assert img.height() == height
@@ -161,7 +159,7 @@ class TestNotificationServer(QObject):
def close(self, notification_id: int) -> None:
"""Sends a close notification for the given ID."""
- message = QDBusMessage.createSignal(
+ message = dbus.QDBusMessage.createSignal(
notification.DBusNotificationAdapter.PATH,
notification.DBusNotificationAdapter.INTERFACE,
"NotificationClosed")
@@ -181,7 +179,7 @@ class TestNotificationServer(QObject):
def action(self, notification_id: int, name: str) -> None:
"""Sends an action notification for the given ID."""
- message = QDBusMessage.createSignal(
+ message = dbus.QDBusMessage.createSignal(
notification.DBusNotificationAdapter.PATH,
notification.DBusNotificationAdapter.INTERFACE,
"ActionInvoked")
@@ -193,10 +191,10 @@ class TestNotificationServer(QObject):
# Everything below is exposed via DBus
# pylint: disable=invalid-name
- @pyqtSlot(QDBusMessage, result="uint")
- def Notify(self, dbus_message: QDBusMessage) -> int:
+ @core.pyqtSlot(dbus.QDBusMessage, result="uint")
+ def Notify(self, dbus_message: dbus.QDBusMessage) -> int:
assert dbus_message.signature() == 'susssasa{sv}i'
- assert dbus_message.type() == QDBusMessage.MessageType.MethodCallMessage
+ assert dbus_message.type() == dbus.QDBusMessage.MessageType.MethodCallMessage
message = self._parse_notify_args(*dbus_message.arguments())
@@ -209,11 +207,11 @@ class TestNotificationServer(QObject):
self.last_id = message_id
return message_id
- @pyqtSlot(QDBusMessage, result="QStringList")
- def GetCapabilities(self, message: QDBusMessage) -> List[str]:
+ @core.pyqtSlot(dbus.QDBusMessage, result="QStringList")
+ def GetCapabilities(self, message: dbus.QDBusMessage) -> List[str]:
assert not message.signature()
assert not message.arguments()
- assert message.type() == QDBusMessage.MessageType.MethodCallMessage
+ assert message.type() == dbus.QDBusMessage.MessageType.MethodCallMessage
capabilities = ["actions", "x-kde-origin-name"]
if self.supports_body_markup:
@@ -221,10 +219,10 @@ class TestNotificationServer(QObject):
return capabilities
- @pyqtSlot(QDBusMessage)
- def CloseNotification(self, dbus_message: QDBusMessage) -> None:
+ @core.pyqtSlot(dbus.QDBusMessage)
+ def CloseNotification(self, dbus_message: dbus.QDBusMessage) -> None:
assert dbus_message.signature() == 'u'
- assert dbus_message.type() == QDBusMessage.MessageType.MethodCallMessage
+ assert dbus_message.type() == dbus.QDBusMessage.MessageType.MethodCallMessage
message_id = dbus_message.arguments()[0]
self.messages[message_id].closed_via_web = True
diff --git a/tests/end2end/fixtures/quteprocess.py b/tests/end2end/fixtures/quteprocess.py
index 02deafb66..c4b277015 100644
--- a/tests/end2end/fixtures/quteprocess.py
+++ b/tests/end2end/fixtures/quteprocess.py
@@ -33,13 +33,12 @@ import json
import yaml
import pytest
-from qutebrowser.qt.core import pyqtSignal, QUrl, QPoint
-from qutebrowser.qt.gui import QImage, QColor
from qutebrowser.misc import ipc
from qutebrowser.utils import log, utils, javascript
from helpers import testutils
from end2end.fixtures import testprocess
+from qutebrowser.qt import gui, core
instance_counter = itertools.count()
@@ -213,7 +212,7 @@ class QuteProc(testprocess.Process):
got_error: Emitted when there was an error log line.
"""
- got_error = pyqtSignal()
+ got_error = core.pyqtSignal()
KEYS = ['timestamp', 'loglevel', 'category', 'module', 'function', 'line',
'message']
@@ -593,14 +592,14 @@ class QuteProc(testprocess.Process):
else:
timeout = 5000
- qurl = QUrl(url)
+ qurl = core.QUrl(url)
if not qurl.isValid():
raise ValueError("Invalid URL {}: {}".format(url,
qurl.errorString()))
# We really need the same representation that the webview uses in
# its __repr__
- url = utils.elide(qurl.toDisplayString(QUrl.ComponentFormattingOption.EncodeUnicode), 100)
+ url = utils.elide(qurl.toDisplayString(core.QUrl.ComponentFormattingOption.EncodeUnicode), 100)
assert url
pattern = re.compile(
@@ -654,9 +653,9 @@ class QuteProc(testprocess.Process):
def get_screenshot(
self,
*,
- probe_pos: QPoint = None,
- probe_color: QColor = testutils.Color(0, 0, 0),
- ) -> QImage:
+ probe_pos: core.QPoint = None,
+ probe_color: gui.QColor = testutils.Color(0, 0, 0),
+ ) -> gui.QImage:
"""Get a screenshot of the current page.
Arguments:
@@ -674,7 +673,7 @@ class QuteProc(testprocess.Process):
self.wait_for(message=screenshot_msg)
print(screenshot_msg)
- img = QImage(str(path))
+ img = gui.QImage(str(path))
assert not img.isNull()
if probe_pos is None:
diff --git a/tests/end2end/fixtures/test_testprocess.py b/tests/end2end/fixtures/test_testprocess.py
index dd16b8b8f..2a4015f72 100644
--- a/tests/end2end/fixtures/test_testprocess.py
+++ b/tests/end2end/fixtures/test_testprocess.py
@@ -25,7 +25,7 @@ import contextlib
import datetime
import pytest
-from qutebrowser.qt.core import QProcess
+from qutebrowser.qt import core
from end2end.fixtures import testprocess
@@ -53,7 +53,7 @@ class PythonProcess(testprocess.Process):
def __init__(self, request):
super().__init__(request)
- self.proc.setReadChannel(QProcess.ProcessChannel.StandardOutput)
+ self.proc.setReadChannel(core.QProcess.ProcessChannel.StandardOutput)
self.code = None
def _parse_line(self, line):
diff --git a/tests/end2end/fixtures/testprocess.py b/tests/end2end/fixtures/testprocess.py
index 78c08a4c0..822d57b7a 100644
--- a/tests/end2end/fixtures/testprocess.py
+++ b/tests/end2end/fixtures/testprocess.py
@@ -26,13 +26,12 @@ import dataclasses
import pytest
import pytestqt.wait_signal
-from qutebrowser.qt.core import (pyqtSlot, pyqtSignal, QProcess, QObject,
- QElapsedTimer, QProcessEnvironment)
-from qutebrowser.qt.test import QSignalSpy
+from qutebrowser.qt import test
from helpers import testutils
from qutebrowser.utils import utils as quteutils
+from qutebrowser.qt import core
class InvalidLine(Exception):
@@ -120,7 +119,7 @@ def pytest_runtest_makereport(item, call):
f"{name} output", _render_log(content, verbose=verbose))
-class Process(QObject):
+class Process(core.QObject):
"""Abstraction over a running test subprocess process.
@@ -139,8 +138,8 @@ class Process(QObject):
new_data: Emitted when a new line was parsed.
"""
- ready = pyqtSignal()
- new_data = pyqtSignal(object)
+ ready = core.pyqtSignal()
+ new_data = core.pyqtSignal(object)
KEYS = ['data']
def __init__(self, request, parent=None):
@@ -150,8 +149,8 @@ class Process(QObject):
self._started = False
self._invalid = []
self._data = []
- self.proc = QProcess()
- self.proc.setReadChannel(QProcess.ProcessChannel.StandardError)
+ self.proc = core.QProcess()
+ self.proc.setReadChannel(core.QProcess.ProcessChannel.StandardError)
self.exit_expected = None # Not started at all yet
def _log(self, line):
@@ -202,7 +201,7 @@ class Process(QObject):
blocker.connect(signal)
return blocker
- @pyqtSlot()
+ @core.pyqtSlot()
def read_log(self):
"""Read the log from the process' stdout."""
if not hasattr(self, 'proc'):
@@ -259,7 +258,7 @@ class Process(QObject):
if args is None:
args = self._default_args()
- procenv = QProcessEnvironment.systemEnvironment()
+ procenv = core.QProcessEnvironment.systemEnvironment()
if env is not None:
for k, v in env.items():
procenv.insert(k, v)
@@ -325,7 +324,7 @@ class Process(QObject):
def is_running(self):
"""Check if the process is currently running."""
- return self.proc.state() == QProcess.ProcessState.Running
+ return self.proc.state() == core.QProcess.ProcessState.Running
def _match_data(self, value, expected):
"""Helper for wait_for to match a given value.
@@ -394,8 +393,8 @@ class Process(QObject):
elided = quteutils.elide(repr(message), 100)
self._log("\n----> Waiting for {} in the log".format(elided))
- spy = QSignalSpy(self.new_data)
- elapsed_timer = QElapsedTimer()
+ spy = test.QSignalSpy(self.new_data)
+ elapsed_timer = core.QElapsedTimer()
elapsed_timer.start()
while True:
diff --git a/tests/end2end/fixtures/webserver.py b/tests/end2end/fixtures/webserver.py
index fc76c959d..263e48ced 100644
--- a/tests/end2end/fixtures/webserver.py
+++ b/tests/end2end/fixtures/webserver.py
@@ -28,9 +28,9 @@ import dataclasses
from http import HTTPStatus
import pytest
-from qutebrowser.qt.core import pyqtSignal, QUrl
from end2end.fixtures import testprocess
+from qutebrowser.qt import core
class Request(testprocess.Line):
@@ -94,7 +94,7 @@ class Request(testprocess.Line):
default_statuses = [HTTPStatus.OK, HTTPStatus.NOT_MODIFIED]
- sanitized = QUrl('http://localhost' + self.path).path() # Remove ?foo
+ sanitized = core.QUrl('http://localhost' + self.path).path() # Remove ?foo
expected_statuses = path_to_statuses.get(sanitized, default_statuses)
if self.status not in expected_statuses:
raise AssertionError(
@@ -136,7 +136,7 @@ class WebserverProcess(testprocess.Process):
new_request: Emitted when there's a new request received.
"""
- new_request = pyqtSignal(Request)
+ new_request = core.pyqtSignal(Request)
Request = Request # So it can be used from the fixture easily.
ExpectedRequest = ExpectedRequest
diff --git a/tests/end2end/test_dirbrowser.py b/tests/end2end/test_dirbrowser.py
index ebf31abe2..e4dc1258d 100644
--- a/tests/end2end/test_dirbrowser.py
+++ b/tests/end2end/test_dirbrowser.py
@@ -27,7 +27,7 @@ from typing import List
import pytest
import bs4
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import core
from qutebrowser.utils import urlutils
from helpers import testutils
@@ -147,14 +147,14 @@ def parse(quteproc):
if not parent_elem:
parent = None
else:
- parent = pathlib.Path(QUrl(parent_elem[0].li.a['href']).toLocalFile())
+ parent = pathlib.Path(core.QUrl(parent_elem[0].li.a['href']).toLocalFile())
folders = []
files = []
for css_class, list_ in [('folders', folders), ('files', files)]:
for li in container('ul', class_=css_class)[0]('li'):
- item_path = pathlib.Path(QUrl(li.a['href']).toLocalFile())
+ item_path = pathlib.Path(core.QUrl(li.a['href']).toLocalFile())
list_.append(Item(path=item_path, link=li.a['href'],
text=str(li.a.string)))
diff --git a/tests/end2end/test_invocations.py b/tests/end2end/test_invocations.py
index 94c747217..072be4293 100644
--- a/tests/end2end/test_invocations.py
+++ b/tests/end2end/test_invocations.py
@@ -29,10 +29,10 @@ import json
import platform
import pytest
-from qutebrowser.qt.core import QProcess, QPoint
from helpers import testutils
from qutebrowser.utils import qtutils, utils, version
+from qutebrowser.qt import core
ascii_locale = pytest.mark.skipif(sys.hexversion >= 0x03070000,
@@ -261,8 +261,8 @@ def test_version(request):
args = ['-m', 'qutebrowser', '--version'] + _base_args(request.config)
# can't use quteproc_new here because it's confused by
# early process termination
- proc = QProcess()
- proc.setProcessChannelMode(QProcess.ProcessChannelMode.SeparateChannels)
+ proc = core.QProcess()
+ proc.setProcessChannelMode(core.QProcess.ProcessChannelMode.SeparateChannels)
proc.start(sys.executable, args)
ok = proc.waitForStarted(2000)
@@ -275,7 +275,7 @@ def test_version(request):
print(stderr)
assert ok
- assert proc.exitStatus() == QProcess.ExitStatus.NormalExit
+ assert proc.exitStatus() == core.QProcess.ExitStatus.NormalExit
match = re.search(r'^qutebrowser\s+v\d+(\.\d+)', stdout, re.MULTILINE)
assert match is not None
@@ -547,7 +547,7 @@ def test_preferred_colorscheme_with_dark_mode(
else testutils.Color(127, 127, 127))
xfail = "Chromium bug 1177973"
- pos = QPoint(0, 0)
+ pos = core.QPoint(0, 0)
img = quteproc_new.get_screenshot(probe_pos=pos, probe_color=expected_color)
color = testutils.Color(img.pixelColor(pos))
@@ -732,7 +732,7 @@ def test_dark_mode(webengine_versions, quteproc_new, request,
# Position chosen by fair dice roll.
# https://xkcd.com/221/
quteproc_new.get_screenshot(
- probe_pos=QPoint(4, 4),
+ probe_pos=core.QPoint(4, 4),
probe_color=expected,
)
@@ -759,13 +759,13 @@ def test_dark_mode_mathml(webengine_versions, quteproc_new, request, qtbot, suff
expected = testutils.Color(0, 0, 206) if IS_ARM else testutils.Color(0, 0, 204)
quteproc_new.get_screenshot(
- probe_pos=QPoint(105, 0),
+ probe_pos=core.QPoint(105, 0),
probe_color=expected,
)
# Then get the actual formula color, probing again in case it's not displayed yet...
quteproc_new.get_screenshot(
- probe_pos=QPoint(4, 4),
+ probe_pos=core.QPoint(4, 4),
probe_color=testutils.Color(255, 255, 255),
)
diff --git a/tests/helpers/fixtures.py b/tests/helpers/fixtures.py
index b46deaa4e..1daa8d741 100644
--- a/tests/helpers/fixtures.py
+++ b/tests/helpers/fixtures.py
@@ -37,9 +37,7 @@ import dataclasses
import pytest
import py.path # pylint: disable=no-name-in-module
-from qutebrowser.qt.core import QSize, Qt
-from qutebrowser.qt.widgets import QWidget, QHBoxLayout, QVBoxLayout
-from qutebrowser.qt.network import QNetworkCookieJar
+from qutebrowser.qt import widgets, webenginecore, network
import helpers.stubs as stubsmod
import qutebrowser
@@ -51,20 +49,20 @@ from qutebrowser.browser import greasemonkey, history, qutescheme
from qutebrowser.browser.webkit import cookies, cache
from qutebrowser.misc import savemanager, sql, objects, sessions
from qutebrowser.keyinput import modeman
-from qutebrowser.qt import sip
+from qutebrowser.qt import core, sip
_qute_scheme_handler = None
-class WidgetContainer(QWidget):
+class WidgetContainer(widgets.QWidget):
"""Container for another widget."""
def __init__(self, qtbot, parent=None):
super().__init__(parent)
self._qtbot = qtbot
- self.vbox = QVBoxLayout(self)
+ self.vbox = widgets.QVBoxLayout(self)
qtbot.add_widget(self)
self._widget = None
@@ -117,20 +115,20 @@ class WinRegistryHelper:
del objreg.window_registry[win_id]
-class FakeStatusBar(QWidget):
+class FakeStatusBar(widgets.QWidget):
"""Fake statusbar to test progressbar sizing."""
def __init__(self, parent=None):
super().__init__(parent)
- self.hbox = QHBoxLayout(self)
+ self.hbox = widgets.QHBoxLayout(self)
self.hbox.addStretch()
self.hbox.setContentsMargins(0, 0, 0, 0)
- self.setAttribute(Qt.WidgetAttribute.WA_StyledBackground, True)
+ self.setAttribute(core.Qt.WidgetAttribute.WA_StyledBackground, True)
self.setStyleSheet('background-color: red;')
def minimumSizeHint(self):
- return QSize(1, self.fontMetrics().height())
+ return core.QSize(1, self.fontMetrics().height())
@pytest.fixture
@@ -177,11 +175,10 @@ def testdata_scheme(qapp):
try:
global _qute_scheme_handler
from qutebrowser.browser.webengine import webenginequtescheme
- from qutebrowser.qt.webenginecore import QWebEngineProfile
webenginequtescheme.init()
_qute_scheme_handler = webenginequtescheme.QuteSchemeHandler(
parent=qapp)
- _qute_scheme_handler.install(QWebEngineProfile.defaultProfile())
+ _qute_scheme_handler.install(webenginecore.QWebEngineProfile.defaultProfile())
except ImportError:
pass
@@ -432,10 +429,9 @@ def unicode_encode_err():
@pytest.fixture(scope='session')
def qnam(qapp):
"""Session-wide QNetworkAccessManager."""
- from qutebrowser.qt.network import QNetworkAccessManager
- nam = QNetworkAccessManager()
+ nam = network.QNetworkAccessManager()
try:
- nam.setNetworkAccessible(QNetworkAccessManager.NetworkAccessibility.NotAccessible)
+ nam.setNetworkAccessible(network.QNetworkAccessManager.NetworkAccessibility.NotAccessible)
except AttributeError:
# Qt 5 only, deprecated seemingly without replacement.
pass
@@ -501,7 +497,7 @@ def webframe(webpage):
@pytest.fixture
def cookiejar_and_cache(stubs, monkeypatch):
"""Fixture providing a fake cookie jar and cache."""
- monkeypatch.setattr(cookies, 'cookie_jar', QNetworkCookieJar())
+ monkeypatch.setattr(cookies, 'cookie_jar', network.QNetworkCookieJar())
monkeypatch.setattr(cookies, 'ram_cookie_jar', cookies.RAMCookieJar())
monkeypatch.setattr(cache, 'diskcache', stubs.FakeNetworkCache())
@@ -696,7 +692,7 @@ def web_history(fake_save_manager, tmpdir, database, config_stub, stubs,
@pytest.fixture
def blue_widget(qtbot):
- widget = QWidget()
+ widget = widgets.QWidget()
widget.setStyleSheet('background-color: blue;')
qtbot.add_widget(widget)
return widget
@@ -704,7 +700,7 @@ def blue_widget(qtbot):
@pytest.fixture
def red_widget(qtbot):
- widget = QWidget()
+ widget = widgets.QWidget()
widget.setStyleSheet('background-color: red;')
qtbot.add_widget(widget)
return widget
diff --git a/tests/helpers/messagemock.py b/tests/helpers/messagemock.py
index 3ec882e54..1cdd267c7 100644
--- a/tests/helpers/messagemock.py
+++ b/tests/helpers/messagemock.py
@@ -22,12 +22,12 @@
import logging
import pytest
-from qutebrowser.qt.core import pyqtSlot, pyqtSignal, QObject
from qutebrowser.utils import usertypes, message
+from qutebrowser.qt import core
-class MessageMock(QObject):
+class MessageMock(core.QObject):
"""Helper object for message_mock.
@@ -37,8 +37,8 @@ class MessageMock(QObject):
_logger: The logger to use for messages/questions.
"""
- got_message = pyqtSignal(message.MessageInfo)
- got_question = pyqtSignal(usertypes.Question)
+ got_message = core.pyqtSignal(message.MessageInfo)
+ got_question = core.pyqtSignal(usertypes.Question)
def __init__(self, parent=None):
super().__init__(parent)
@@ -46,7 +46,7 @@ class MessageMock(QObject):
self.questions = []
self._logger = logging.getLogger('messagemock')
- @pyqtSlot(message.MessageInfo)
+ @core.pyqtSlot(message.MessageInfo)
def _record_message(self, info):
self.got_message.emit(info)
log_levels = {
@@ -59,7 +59,7 @@ class MessageMock(QObject):
self._logger.log(log_level, info.text)
self.messages.append(info)
- @pyqtSlot(usertypes.Question)
+ @core.pyqtSlot(usertypes.Question)
def _record_question(self, question):
self.got_question.emit(question)
self._logger.debug(question)
diff --git a/tests/helpers/stubs.py b/tests/helpers/stubs.py
index 493bfd55e..f8770a34e 100644
--- a/tests/helpers/stubs.py
+++ b/tests/helpers/stubs.py
@@ -29,19 +29,15 @@ import dataclasses
import builtins
import importlib
import types
-
-from qutebrowser.qt.core import pyqtSignal, QPoint, QProcess, QObject, QUrl, QByteArray
-from qutebrowser.qt.gui import QIcon
-from qutebrowser.qt.network import (QNetworkRequest, QAbstractNetworkCache,
- QNetworkCacheMetaData)
-from qutebrowser.qt.widgets import QCommonStyle, QLineEdit, QWidget, QTabBar
+from qutebrowser.qt import widgets, network, gui
from qutebrowser.browser import browsertab, downloads
from qutebrowser.utils import usertypes
from qutebrowser.commands import runners
+from qutebrowser.qt import core
-class FakeNetworkCache(QAbstractNetworkCache):
+class FakeNetworkCache(network.QAbstractNetworkCache):
"""Fake cache with no data."""
@@ -55,7 +51,7 @@ class FakeNetworkCache(QAbstractNetworkCache):
pass
def metaData(self, _url):
- return QNetworkCacheMetaData()
+ return network.QNetworkCacheMetaData()
def prepare(self, _metadata):
return None
@@ -94,7 +90,7 @@ class FakeWebFrame:
parent: The parent frame.
"""
if scroll is None:
- scroll = QPoint(0, 0)
+ scroll = core.QPoint(0, 0)
self.geometry = mock.Mock(return_value=geometry)
self.scrollPosition = mock.Mock(return_value=scroll)
self.parentFrame = mock.Mock(return_value=parent)
@@ -121,7 +117,7 @@ class FakeQApplication:
def __init__(self, *, style=None, all_widgets=None, active_window=None,
arguments=None, platform_name=None):
- self.style = mock.Mock(spec=QCommonStyle)
+ self.style = mock.Mock(spec=widgets.QCommonStyle)
self.style().metaObject().className.return_value = style
self.allWidgets = lambda: all_widgets
@@ -135,12 +131,12 @@ class FakeNetworkReply:
"""QNetworkReply stub which provides a Content-Disposition header."""
KNOWN_HEADERS = {
- QNetworkRequest.KnownHeaders.ContentTypeHeader: 'Content-Type',
+ network.QNetworkRequest.KnownHeaders.ContentTypeHeader: 'Content-Type',
}
def __init__(self, headers=None, url=None):
if url is None:
- url = QUrl()
+ url = core.QUrl()
if headers is None:
self.headers = {}
else:
@@ -193,18 +189,18 @@ class FakeNetworkReply:
self.headers[key] = value
-class FakeProcess(QProcess):
+class FakeProcess(core.QProcess):
- def __init__(self, parent: QObject = None) -> None:
+ def __init__(self, parent: core.QObject = None) -> None:
super().__init__(parent)
- self.start = mock.Mock(spec=QProcess.start)
- self.startDetached = mock.Mock(spec=QProcess.startDetached)
+ self.start = mock.Mock(spec=core.QProcess.start)
+ self.startDetached = mock.Mock(spec=core.QProcess.startDetached)
self.readAllStandardOutput = mock.Mock(
- spec=QProcess.readAllStandardOutput, return_value=QByteArray(b''))
+ spec=core.QProcess.readAllStandardOutput, return_value=core.QByteArray(b''))
self.readAllStandardError = mock.Mock(
- spec=QProcess.readAllStandardError, return_value=QByteArray(b''))
- self.terminate = mock.Mock(spec=QProcess.terminate)
- self.kill = mock.Mock(spec=QProcess.kill)
+ spec=core.QProcess.readAllStandardError, return_value=core.QByteArray(b''))
+ self.terminate = mock.Mock(spec=core.QProcess.terminate)
+ self.kill = mock.Mock(spec=core.QProcess.kill)
class FakeWebTabScroller(browsertab.AbstractScroller):
@@ -256,7 +252,7 @@ class FakeWebTab(browsertab.AbstractTab):
"""Fake AbstractTab to use in tests."""
- def __init__(self, url=QUrl(), title='', tab_id=0, *,
+ def __init__(self, url=core.QUrl(), title='', tab_id=0, *,
scroll_pos_perc=(0, 0),
load_status=usertypes.LoadStatus.success,
progress=0, can_go_back=None, can_go_forward=None):
@@ -270,7 +266,7 @@ class FakeWebTab(browsertab.AbstractTab):
self.scroller = FakeWebTabScroller(self, scroll_pos_perc)
self.audio = FakeWebTabAudio(self)
self.private_api = FakeWebTabPrivate(tab=self, mode_manager=None)
- wrapped = QWidget()
+ wrapped = widgets.QWidget()
self._layout.wrap(self, wrapped)
def url(self, *, requested=False):
@@ -287,7 +283,7 @@ class FakeWebTab(browsertab.AbstractTab):
return self._load_status
def icon(self):
- return QIcon()
+ return gui.QIcon()
def renderer_process_pid(self):
return None
@@ -345,11 +341,11 @@ class FakeCommand:
modes: Tuple[usertypes.KeyMode] = (usertypes.KeyMode.normal, )
-class FakeTimer(QObject):
+class FakeTimer(core.QObject):
"""Stub for a usertypes.Timer."""
- timeout_signal = pyqtSignal()
+ timeout_signal = core.pyqtSignal()
def __init__(self, parent=None, name=None):
super().__init__(parent)
@@ -395,14 +391,14 @@ class FakeTimer(QObject):
return self._started
-class InstaTimer(QObject):
+class InstaTimer(core.QObject):
"""Stub for a QTimer that fires instantly on start().
Useful to test a time-based event without inserting an artificial delay.
"""
- timeout = pyqtSignal()
+ timeout = core.pyqtSignal()
def start(self, interval=None):
self.timeout.emit()
@@ -418,27 +414,27 @@ class InstaTimer(QObject):
fun()
-class StatusBarCommandStub(QLineEdit):
+class StatusBarCommandStub(widgets.QLineEdit):
"""Stub for the statusbar command prompt."""
- got_cmd = pyqtSignal(str)
- clear_completion_selection = pyqtSignal()
- hide_completion = pyqtSignal()
- update_completion = pyqtSignal()
- show_cmd = pyqtSignal()
- hide_cmd = pyqtSignal()
+ got_cmd = core.pyqtSignal(str)
+ clear_completion_selection = core.pyqtSignal()
+ hide_completion = core.pyqtSignal()
+ update_completion = core.pyqtSignal()
+ show_cmd = core.pyqtSignal()
+ hide_cmd = core.pyqtSignal()
def prefix(self):
return self.text()[0]
-class UrlMarkManagerStub(QObject):
+class UrlMarkManagerStub(core.QObject):
"""Stub for the quickmark-manager or bookmark-manager object."""
- added = pyqtSignal(str, str)
- removed = pyqtSignal(str)
+ added = core.pyqtSignal(str, str)
+ removed = core.pyqtSignal(str)
def __init__(self, parent=None):
super().__init__(parent)
@@ -476,7 +472,7 @@ class SessionManagerStub:
pass
-class TabbedBrowserStub(QObject):
+class TabbedBrowserStub(core.QObject):
"""Stub for the tabbed-browser object."""
@@ -506,16 +502,16 @@ class TabbedBrowserStub(QObject):
return self.cur_url
-class TabWidgetStub(QObject):
+class TabWidgetStub(core.QObject):
"""Stub for the tab-widget object."""
- new_tab = pyqtSignal(browsertab.AbstractTab, int)
+ new_tab = core.pyqtSignal(browsertab.AbstractTab, int)
def __init__(self, parent=None):
super().__init__(parent)
self.tabs = []
- self._qtabbar = QTabBar()
+ self._qtabbar = widgets.QTabBar()
self.index_of = None
self.current_index = None
@@ -551,7 +547,7 @@ class TabWidgetStub(QObject):
return self.tabs[idx - 1]
-class HTTPPostStub(QObject):
+class HTTPPostStub(core.QObject):
"""A stub class for HTTPClient.
@@ -560,8 +556,8 @@ class HTTPPostStub(QObject):
data: the last data send by post()
"""
- success = pyqtSignal(str)
- error = pyqtSignal(str)
+ success = core.pyqtSignal(str)
+ error = core.pyqtSignal(str)
def __init__(self, parent=None):
super().__init__(parent)
@@ -573,11 +569,11 @@ class HTTPPostStub(QObject):
self.data = data
-class FakeDownloadItem(QObject):
+class FakeDownloadItem(core.QObject):
"""Mock browser.downloads.DownloadItem."""
- finished = pyqtSignal()
+ finished = core.pyqtSignal()
def __init__(self, fileobj, name, parent=None):
super().__init__(parent)
diff --git a/tests/helpers/test_helper_utils.py b/tests/helpers/test_helper_utils.py
index 3a5f4c4bc..e5d97d1a8 100644
--- a/tests/helpers/test_helper_utils.py
+++ b/tests/helpers/test_helper_utils.py
@@ -22,7 +22,7 @@ import pytest
from helpers import testutils
-from qutebrowser.qt.widgets import QFrame
+from qutebrowser.qt import widgets
@pytest.mark.parametrize('val1, val2', [
@@ -84,8 +84,8 @@ def test_nop_contextmanager():
def test_enum_members():
expected = {
- "Plain": QFrame.Shadow.Plain,
- "Raised": QFrame.Shadow.Raised,
- "Sunken": QFrame.Shadow.Sunken,
+ "Plain": widgets.QFrame.Shadow.Plain,
+ "Raised": widgets.QFrame.Shadow.Raised,
+ "Sunken": widgets.QFrame.Shadow.Sunken,
}
- assert testutils.enum_members(QFrame, QFrame.Shadow) == expected
+ assert testutils.enum_members(widgets.QFrame, widgets.QFrame.Shadow) == expected
diff --git a/tests/helpers/testutils.py b/tests/helpers/testutils.py
index 574c57cb0..fa98474e5 100644
--- a/tests/helpers/testutils.py
+++ b/tests/helpers/testutils.py
@@ -32,14 +32,14 @@ import importlib.machinery
import pytest
-from qutebrowser.qt.gui import QColor
+from qutebrowser.qt import gui
from qutebrowser.utils import log, utils, version
ON_CI = 'CI' in os.environ
-class Color(QColor):
+class Color(gui.QColor):
"""A QColor with a nicer repr()."""
@@ -269,7 +269,7 @@ def disable_seccomp_bpf_sandbox():
newer kernels.
"""
try:
- from qutebrowser.qt import webenginecore # pylint: disable=unused-import
+ pass
except ImportError:
# no QtWebEngine available
return False
diff --git a/tests/unit/browser/test_browsertab.py b/tests/unit/browser/test_browsertab.py
index 60ae0942e..ae227c371 100644
--- a/tests/unit/browser/test_browsertab.py
+++ b/tests/unit/browser/test_browsertab.py
@@ -19,15 +19,15 @@
import pytest
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import core
from qutebrowser.browser import browsertab
class TestAction:
def test_run_string_valid(self, qtbot, web_tab):
- url_1 = QUrl("qute://testdata/data/backforward/1.txt")
- url_2 = QUrl("qute://testdata/data/backforward/2.txt")
+ url_1 = core.QUrl("qute://testdata/data/backforward/1.txt")
+ url_2 = core.QUrl("qute://testdata/data/backforward/2.txt")
with qtbot.wait_signal(web_tab.load_finished):
web_tab.load_url(url_1)
diff --git a/tests/unit/browser/test_caret.py b/tests/unit/browser/test_caret.py
index 60c401e4f..345cfc8d6 100644
--- a/tests/unit/browser/test_caret.py
+++ b/tests/unit/browser/test_caret.py
@@ -22,7 +22,7 @@
import textwrap
import pytest
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import core
from qutebrowser.utils import usertypes
from qutebrowser.browser import browsertab
@@ -33,7 +33,7 @@ def caret(web_tab, qtbot, mode_manager):
web_tab.container.expose()
with qtbot.wait_signal(web_tab.load_finished, timeout=10000):
- web_tab.load_url(QUrl('qute://testdata/data/caret.html'))
+ web_tab.load_url(core.QUrl('qute://testdata/data/caret.html'))
with qtbot.wait_signal(web_tab.caret.selection_toggled):
mode_manager.enter(usertypes.KeyMode.caret)
diff --git a/tests/unit/browser/test_downloadview.py b/tests/unit/browser/test_downloadview.py
index a64b6c12e..22a93ef5a 100644
--- a/tests/unit/browser/test_downloadview.py
+++ b/tests/unit/browser/test_downloadview.py
@@ -20,7 +20,7 @@
import pytest
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import core
from qutebrowser.browser import downloads, qtnetworkdownloads, downloadview
@@ -35,8 +35,8 @@ class FakeDownload(downloads.AbstractDownloadItem):
self.done = done
self.successful = successful
- def url(self) -> QUrl:
- return QUrl('https://example.org/')
+ def url(self) -> core.QUrl:
+ return core.QUrl('https://example.org/')
@pytest.fixture
diff --git a/tests/unit/browser/test_hints.py b/tests/unit/browser/test_hints.py
index 403af74f8..3563059ec 100644
--- a/tests/unit/browser/test_hints.py
+++ b/tests/unit/browser/test_hints.py
@@ -23,7 +23,7 @@ import itertools
import operator
import pytest
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import core
from qutebrowser.utils import usertypes
import qutebrowser.browser.hints
@@ -39,7 +39,7 @@ def tabbed_browser(tabbed_browser_stubs, web_tab):
tb = tabbed_browser_stubs[0]
tb.widget.tabs = [web_tab]
tb.widget.current_index = 1
- tb.widget.cur_url = QUrl('https://www.example.com/')
+ tb.widget.cur_url = core.QUrl('https://www.example.com/')
web_tab.container.expose() # No elements found if we don't do this.
return tb
@@ -49,7 +49,7 @@ def test_show_benchmark(benchmark, tabbed_browser, qtbot, mode_manager):
tab = tabbed_browser.widget.tabs[0]
with qtbot.wait_signal(tab.load_finished):
- tab.load_url(QUrl('qute://testdata/data/hints/benchmark.html'))
+ tab.load_url(core.QUrl('qute://testdata/data/hints/benchmark.html'))
manager = qutebrowser.browser.hints.HintManager(win_id=0)
@@ -69,7 +69,7 @@ def test_match_benchmark(benchmark, tabbed_browser, qtbot, mode_manager, qapp,
tab = tabbed_browser.widget.tabs[0]
with qtbot.wait_signal(tab.load_finished):
- tab.load_url(QUrl('qute://testdata/data/hints/benchmark.html'))
+ tab.load_url(core.QUrl('qute://testdata/data/hints/benchmark.html'))
config_stub.val.hints.scatter = False
manager = qutebrowser.browser.hints.HintManager(win_id=0)
diff --git a/tests/unit/browser/test_history.py b/tests/unit/browser/test_history.py
index 20c76a23f..afa1acc62 100644
--- a/tests/unit/browser/test_history.py
+++ b/tests/unit/browser/test_history.py
@@ -22,7 +22,7 @@
import logging
import pytest
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import webkit, core
from qutebrowser.browser import history
from qutebrowser.utils import urlutils, usertypes
@@ -40,7 +40,7 @@ class TestSpecialMethods:
def test_iter(self, web_history):
urlstr = 'http://www.example.com/'
- url = QUrl(urlstr)
+ url = core.QUrl(urlstr)
web_history.add_url(url, atime=12345)
assert list(web_history) == [(urlstr, '', 12345, False)]
@@ -48,13 +48,13 @@ class TestSpecialMethods:
def test_len(self, web_history):
assert len(web_history) == 0
- url = QUrl('http://www.example.com/')
+ url = core.QUrl('http://www.example.com/')
web_history.add_url(url)
assert len(web_history) == 1
def test_contains(self, web_history):
- web_history.add_url(QUrl('http://www.example.com/'),
+ web_history.add_url(core.QUrl('http://www.example.com/'),
title='Title', atime=12345)
assert 'http://www.example.com/' in web_history
assert 'www.example.com' not in web_history
@@ -65,34 +65,34 @@ class TestSpecialMethods:
class TestGetting:
def test_get_recent(self, web_history):
- web_history.add_url(QUrl('http://www.qutebrowser.org/'), atime=67890)
- web_history.add_url(QUrl('http://example.com/'), atime=12345)
+ web_history.add_url(core.QUrl('http://www.qutebrowser.org/'), atime=67890)
+ web_history.add_url(core.QUrl('http://example.com/'), atime=12345)
assert list(web_history.get_recent()) == [
('http://www.qutebrowser.org/', '', 67890, False),
('http://example.com/', '', 12345, False),
]
def test_entries_between(self, web_history):
- web_history.add_url(QUrl('http://www.example.com/1'), atime=12345)
- web_history.add_url(QUrl('http://www.example.com/2'), atime=12346)
- web_history.add_url(QUrl('http://www.example.com/3'), atime=12347)
- web_history.add_url(QUrl('http://www.example.com/4'), atime=12348)
- web_history.add_url(QUrl('http://www.example.com/5'), atime=12348)
- web_history.add_url(QUrl('http://www.example.com/6'), atime=12349)
- web_history.add_url(QUrl('http://www.example.com/7'), atime=12350)
+ web_history.add_url(core.QUrl('http://www.example.com/1'), atime=12345)
+ web_history.add_url(core.QUrl('http://www.example.com/2'), atime=12346)
+ web_history.add_url(core.QUrl('http://www.example.com/3'), atime=12347)
+ web_history.add_url(core.QUrl('http://www.example.com/4'), atime=12348)
+ web_history.add_url(core.QUrl('http://www.example.com/5'), atime=12348)
+ web_history.add_url(core.QUrl('http://www.example.com/6'), atime=12349)
+ web_history.add_url(core.QUrl('http://www.example.com/7'), atime=12350)
times = [x.atime for x in web_history.entries_between(12346, 12349)]
assert times == [12349, 12348, 12348, 12347]
def test_entries_before(self, web_history):
- web_history.add_url(QUrl('http://www.example.com/1'), atime=12346)
- web_history.add_url(QUrl('http://www.example.com/2'), atime=12346)
- web_history.add_url(QUrl('http://www.example.com/3'), atime=12347)
- web_history.add_url(QUrl('http://www.example.com/4'), atime=12348)
- web_history.add_url(QUrl('http://www.example.com/5'), atime=12348)
- web_history.add_url(QUrl('http://www.example.com/6'), atime=12348)
- web_history.add_url(QUrl('http://www.example.com/7'), atime=12349)
- web_history.add_url(QUrl('http://www.example.com/8'), atime=12349)
+ web_history.add_url(core.QUrl('http://www.example.com/1'), atime=12346)
+ web_history.add_url(core.QUrl('http://www.example.com/2'), atime=12346)
+ web_history.add_url(core.QUrl('http://www.example.com/3'), atime=12347)
+ web_history.add_url(core.QUrl('http://www.example.com/4'), atime=12348)
+ web_history.add_url(core.QUrl('http://www.example.com/5'), atime=12348)
+ web_history.add_url(core.QUrl('http://www.example.com/6'), atime=12348)
+ web_history.add_url(core.QUrl('http://www.example.com/7'), atime=12349)
+ web_history.add_url(core.QUrl('http://www.example.com/8'), atime=12349)
times = [x.atime for x in
web_history.entries_before(12348, limit=3, offset=2)]
@@ -102,8 +102,8 @@ class TestGetting:
class TestDelete:
def test_clear(self, qtbot, tmpdir, web_history, mocker):
- web_history.add_url(QUrl('http://example.com/'))
- web_history.add_url(QUrl('http://www.qutebrowser.org/'))
+ web_history.add_url(core.QUrl('http://example.com/'))
+ web_history.add_url(core.QUrl('http://www.qutebrowser.org/'))
m = mocker.patch('qutebrowser.browser.history.message.confirm_async',
new=mocker.Mock, spec=[])
@@ -111,8 +111,8 @@ class TestDelete:
assert m.called
def test_clear_force(self, qtbot, tmpdir, web_history):
- web_history.add_url(QUrl('http://example.com/'))
- web_history.add_url(QUrl('http://www.qutebrowser.org/'))
+ web_history.add_url(core.QUrl('http://example.com/'))
+ web_history.add_url(core.QUrl('http://www.qutebrowser.org/'))
history.history_clear(force=True)
assert not len(web_history)
assert not len(web_history.completion)
@@ -122,14 +122,14 @@ class TestDelete:
('http://example.com/1 2', 'http://example.com/1%202'),
])
def test_delete_url(self, web_history, raw, escaped):
- web_history.add_url(QUrl('http://example.com/'), atime=0)
- web_history.add_url(QUrl(escaped), atime=0)
- web_history.add_url(QUrl('http://example.com/2'), atime=0)
+ web_history.add_url(core.QUrl('http://example.com/'), atime=0)
+ web_history.add_url(core.QUrl(escaped), atime=0)
+ web_history.add_url(core.QUrl('http://example.com/2'), atime=0)
before = set(web_history)
completion_before = set(web_history.completion)
- web_history.delete_url(QUrl(raw))
+ web_history.delete_url(core.QUrl(raw))
diff = before.difference(set(web_history))
assert diff == {(escaped, '', 0, False)}
@@ -161,7 +161,7 @@ class TestAdd:
)
def test_add_url(self, qtbot, web_history,
url, atime, title, redirect, history_url, completion_url):
- web_history.add_url(QUrl(url), atime=atime, title=title,
+ web_history.add_url(core.QUrl(url), atime=atime, title=title,
redirect=redirect)
assert list(web_history) == [(history_url, title, atime, redirect)]
if completion_url is None:
@@ -172,13 +172,13 @@ class TestAdd:
def test_no_sql_web_history(self, web_history, monkeypatch):
monkeypatch.setattr(objects, 'debug_flags', {'no-sql-history'})
- web_history.add_url(QUrl('https://www.example.com/'), atime=12346,
+ web_history.add_url(core.QUrl('https://www.example.com/'), atime=12346,
title='Hello World', redirect=False)
assert not list(web_history)
def test_invalid(self, qtbot, web_history, caplog):
with caplog.at_level(logging.WARNING):
- web_history.add_url(QUrl())
+ web_history.add_url(core.QUrl())
assert not list(web_history)
assert not list(web_history.completion)
@@ -198,12 +198,12 @@ class TestAdd:
if known_error:
with caplog.at_level(logging.ERROR):
- web_history.add_url(QUrl('https://www.example.org/'))
+ web_history.add_url(core.QUrl('https://www.example.org/'))
msg = message_mock.getmsg(usertypes.MessageLevel.error)
assert msg.text == "Failed to write history: Error message"
else:
with pytest.raises(sql.BugError):
- web_history.add_url(QUrl('https://www.example.org/'))
+ web_history.add_url(core.QUrl('https://www.example.org/'))
@pytest.mark.parametrize('level, url, req_url, expected', [
(logging.DEBUG, 'a.com', 'a.com', [('a.com', 'title', 12345, False)]),
@@ -228,46 +228,46 @@ class TestAdd:
def test_from_tab(self, web_history, caplog, mock_time,
level, url, req_url, expected):
with caplog.at_level(level):
- web_history.add_from_tab(QUrl(url), QUrl(req_url), 'title')
+ web_history.add_from_tab(core.QUrl(url), core.QUrl(req_url), 'title')
assert set(web_history) == set(expected)
def test_exclude(self, web_history, config_stub):
"""Excluded URLs should be in the history but not completion."""
config_stub.val.completion.web_history.exclude = ['*.example.org']
- url = QUrl('http://www.example.org/')
+ url = core.QUrl('http://www.example.org/')
web_history.add_from_tab(url, url, 'title')
assert list(web_history)
assert not list(web_history.completion)
def test_no_immedate_duplicates(self, web_history, mock_time):
- url = QUrl("http://example.com")
- url2 = QUrl("http://example2.com")
- web_history.add_from_tab(QUrl(url), QUrl(url), 'title')
+ url = core.QUrl("http://example.com")
+ url2 = core.QUrl("http://example2.com")
+ web_history.add_from_tab(core.QUrl(url), core.QUrl(url), 'title')
hist = list(web_history)
assert hist
- web_history.add_from_tab(QUrl(url), QUrl(url), 'title')
+ web_history.add_from_tab(core.QUrl(url), core.QUrl(url), 'title')
assert list(web_history) == hist
- web_history.add_from_tab(QUrl(url2), QUrl(url2), 'title')
+ web_history.add_from_tab(core.QUrl(url2), core.QUrl(url2), 'title')
assert list(web_history) != hist
def test_delete_add_tab(self, web_history, mock_time):
- url = QUrl("http://example.com")
- web_history.add_from_tab(QUrl(url), QUrl(url), 'title')
+ url = core.QUrl("http://example.com")
+ web_history.add_from_tab(core.QUrl(url), core.QUrl(url), 'title')
hist = list(web_history)
assert hist
- web_history.delete_url(QUrl(url))
+ web_history.delete_url(core.QUrl(url))
assert len(web_history) == 0
- web_history.add_from_tab(QUrl(url), QUrl(url), 'title')
+ web_history.add_from_tab(core.QUrl(url), core.QUrl(url), 'title')
assert list(web_history) == hist
def test_clear_add_tab(self, web_history, mock_time):
- url = QUrl("http://example.com")
- web_history.add_from_tab(QUrl(url), QUrl(url), 'title')
+ url = core.QUrl("http://example.com")
+ web_history.add_from_tab(core.QUrl(url), core.QUrl(url), 'title')
hist = list(web_history)
assert hist
history.history_clear(force=True)
assert len(web_history) == 0
- web_history.add_from_tab(QUrl(url), QUrl(url), 'title')
+ web_history.add_from_tab(core.QUrl(url), core.QUrl(url), 'title')
assert list(web_history) == hist
@@ -280,7 +280,7 @@ class TestHistoryInterface:
from qutebrowser.browser.webkit import webkithistory
QWebHistoryInterface = QtWebKit.QWebHistoryInterface
# pylint: enable=invalid-name
- web_history.add_url(url=QUrl('http://www.example.com/'),
+ web_history.add_url(url=core.QUrl('http://www.example.com/'),
title='example')
interface = webkithistory.WebHistoryInterface(web_history)
QWebHistoryInterface.setDefaultInterface(interface)
@@ -304,8 +304,7 @@ class TestInit:
history.web_history.setParent(None)
history.web_history = None
try:
- from qutebrowser.qt.webkit import QWebHistoryInterface
- QWebHistoryInterface.setDefaultInterface(None)
+ webkit.QWebHistoryInterface.setDefaultInterface(None)
except ImportError:
pass
@@ -322,19 +321,19 @@ class TestInit:
assert history.web_history.parent() is qapp
try:
- from qutebrowser.qt.webkit import QWebHistoryInterface
+ pass
except ImportError:
QWebHistoryInterface = None
if backend == usertypes.Backend.QtWebKit:
- default_interface = QWebHistoryInterface.defaultInterface()
+ default_interface = webkit.QWebHistoryInterface.defaultInterface()
assert default_interface._history is history.web_history
else:
assert backend == usertypes.Backend.QtWebEngine
- if QWebHistoryInterface is None:
+ if webkit.QWebHistoryInterface is None:
default_interface = None
else:
- default_interface = QWebHistoryInterface.defaultInterface()
+ default_interface = webkit.QWebHistoryInterface.defaultInterface()
# For this to work, nothing can ever have called
# setDefaultInterface before (so we need to test webengine before
# webkit)
@@ -344,13 +343,13 @@ class TestInit:
class TestDump:
def test_debug_dump_history(self, web_history, tmpdir):
- web_history.add_url(QUrl('http://example.com/1'),
+ web_history.add_url(core.QUrl('http://example.com/1'),
title="Title1", atime=12345)
- web_history.add_url(QUrl('http://example.com/2'),
+ web_history.add_url(core.QUrl('http://example.com/2'),
title="Title2", atime=12346)
- web_history.add_url(QUrl('http://example.com/3'),
+ web_history.add_url(core.QUrl('http://example.com/3'),
title="Title3", atime=12347)
- web_history.add_url(QUrl('http://example.com/4'),
+ web_history.add_url(core.QUrl('http://example.com/4'),
title="Title4", atime=12348, redirect=True)
histfile = tmpdir / 'history'
history.debug_dump_history(str(histfile))
@@ -371,8 +370,8 @@ class TestRebuild:
def test_user_version(self, database, stubs, monkeypatch):
"""Ensure that completion is regenerated if user_version changes."""
web_history = history.WebHistory(database, stubs.FakeHistoryProgress())
- web_history.add_url(QUrl('example.com/1'), redirect=False, atime=1)
- web_history.add_url(QUrl('example.com/2'), redirect=False, atime=2)
+ web_history.add_url(core.QUrl('example.com/1'), redirect=False, atime=1)
+ web_history.add_url(core.QUrl('example.com/2'), redirect=False, atime=2)
web_history.completion.delete('url', 'example.com/2')
hist2 = history.WebHistory(database, progress=stubs.FakeHistoryProgress())
@@ -391,8 +390,8 @@ class TestRebuild:
def test_force_rebuild(self, database, stubs):
"""Ensure that completion is regenerated if we force a rebuild."""
web_history = history.WebHistory(database, stubs.FakeHistoryProgress())
- web_history.add_url(QUrl('example.com/1'), redirect=False, atime=1)
- web_history.add_url(QUrl('example.com/2'), redirect=False, atime=2)
+ web_history.add_url(core.QUrl('example.com/1'), redirect=False, atime=1)
+ web_history.add_url(core.QUrl('example.com/2'), redirect=False, atime=2)
web_history.completion.delete('url', 'example.com/2')
hist2 = history.WebHistory(web_history.database,
@@ -415,9 +414,9 @@ class TestRebuild:
"""
config_stub.val.completion.web_history.exclude = ['*.example.org']
- web_history.add_url(QUrl('http://example.com'),
+ web_history.add_url(core.QUrl('http://example.com'),
redirect=False, atime=1)
- web_history.add_url(QUrl('http://example.org'),
+ web_history.add_url(core.QUrl('http://example.org'),
redirect=False, atime=2)
hist2 = history.WebHistory(web_history.database,
@@ -428,9 +427,9 @@ class TestRebuild:
"""Ensure that completion is rebuilt when exclude patterns change."""
config_stub.val.completion.web_history.exclude = ['*.example.org']
- web_history.add_url(QUrl('http://example.com'),
+ web_history.add_url(core.QUrl('http://example.com'),
redirect=False, atime=1)
- web_history.add_url(QUrl('http://example.org'),
+ web_history.add_url(core.QUrl('http://example.org'),
redirect=False, atime=2)
hist2 = history.WebHistory(web_history.database,
@@ -449,8 +448,8 @@ class TestRebuild:
]
def test_progress(self, monkeypatch, web_history, config_stub, stubs):
- web_history.add_url(QUrl('example.com/1'), redirect=False, atime=1)
- web_history.add_url(QUrl('example.com/2'), redirect=False, atime=2)
+ web_history.add_url(core.QUrl('example.com/1'), redirect=False, atime=1)
+ web_history.add_url(core.QUrl('example.com/2'), redirect=False, atime=2)
# Trigger a completion rebuild
monkeypatch.setattr(web_history.database, 'user_version_changed', lambda: True)
@@ -464,7 +463,7 @@ class TestRebuild:
def test_interrupted(self, stubs, database, monkeypatch):
"""If we interrupt the rebuilding process, force_rebuild should still be set."""
web_history = history.WebHistory(database, stubs.FakeHistoryProgress())
- web_history.add_url(QUrl('example.com/1'), redirect=False, atime=1)
+ web_history.add_url(core.QUrl('example.com/1'), redirect=False, atime=1)
web_history.completion.delete('url', 'example.com/1')
progress = stubs.FakeHistoryProgress(raise_on_tick=True)
diff --git a/tests/unit/browser/test_inspector.py b/tests/unit/browser/test_inspector.py
index 35b570482..4f48b77b0 100644
--- a/tests/unit/browser/test_inspector.py
+++ b/tests/unit/browser/test_inspector.py
@@ -19,7 +19,7 @@
import pytest
-from qutebrowser.qt.widgets import QWidget
+from qutebrowser.qt import widgets
from qutebrowser.browser import inspector
from qutebrowser.misc import miscwidgets
@@ -28,10 +28,10 @@ from qutebrowser.misc import miscwidgets
class FakeInspector(inspector.AbstractWebInspector):
def __init__(self,
- inspector_widget: QWidget,
+ inspector_widget: widgets.QWidget,
splitter: miscwidgets.InspectorSplitter,
win_id: int,
- parent: QWidget = None) -> None:
+ parent: widgets.QWidget = None) -> None:
super().__init__(splitter, win_id, parent)
self._set_widget(inspector_widget)
self._inspected_page = None
diff --git a/tests/unit/browser/test_navigate.py b/tests/unit/browser/test_navigate.py
index 427058c68..2a45b9351 100644
--- a/tests/unit/browser/test_navigate.py
+++ b/tests/unit/browser/test_navigate.py
@@ -20,7 +20,7 @@
import pytest
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import core
from qutebrowser.browser import navigate
from qutebrowser.utils import urlutils
@@ -69,23 +69,23 @@ class TestIncDec:
else:
expected_value = value.format(19)
- base_url = QUrl(url.format(base_value))
- expected_url = QUrl(url.format(expected_value))
+ base_url = core.QUrl(url.format(base_value))
+ expected_url = core.QUrl(url.format(expected_value))
assert navigate.incdec(base_url, 1, incdec) == expected_url
def test_port(self, config_stub):
config_stub.val.url.incdec_segments = ['port']
- base_url = QUrl('http://localhost:8000')
+ base_url = core.QUrl('http://localhost:8000')
new_url = navigate.incdec(base_url, 1, 'increment')
- assert new_url == QUrl('http://localhost:8001')
+ assert new_url == core.QUrl('http://localhost:8001')
new_url = navigate.incdec(base_url, 1, 'decrement')
- assert new_url == QUrl('http://localhost:7999')
+ assert new_url == core.QUrl('http://localhost:7999')
def test_port_default(self, config_stub):
"""Test that a default port (with url.port() == -1) is not touched."""
config_stub.val.url.incdec_segments = ['port']
- base_url = QUrl('http://localhost')
+ base_url = core.QUrl('http://localhost')
with pytest.raises(navigate.Error):
navigate.incdec(base_url, 1, 'increment')
@@ -112,8 +112,8 @@ class TestIncDec:
return
expected_value = value.format(20 - count)
- base_url = QUrl(url.format(base_value))
- expected_url = QUrl(url.format(expected_value))
+ base_url = core.QUrl(url.format(base_value))
+ expected_url = core.QUrl(url.format(expected_value))
new_url = navigate.incdec(base_url, count, inc_or_dec)
assert new_url == expected_url
@@ -129,8 +129,8 @@ class TestIncDec:
def test_leading_zeroes(self, number, expected, inc_or_dec, config_stub):
config_stub.val.url.incdec_segments = ['path']
url = 'http://example.com/{}'
- base_url = QUrl(url.format(number))
- expected_url = QUrl(url.format(expected))
+ base_url = core.QUrl(url.format(number))
+ expected_url = core.QUrl(url.format(expected))
new_url = navigate.incdec(base_url, 1, inc_or_dec)
assert new_url == expected_url
@@ -144,8 +144,8 @@ class TestIncDec:
])
def test_segment_ignored(self, url, segments, expected, config_stub):
config_stub.val.url.incdec_segments = segments
- new_url = navigate.incdec(QUrl(url), 1, 'increment')
- assert new_url == QUrl(expected)
+ new_url = navigate.incdec(core.QUrl(url), 1, 'increment')
+ assert new_url == core.QUrl(expected)
@pytest.mark.parametrize('url', [
"http://example.com/long/path/but/no/number",
@@ -160,7 +160,7 @@ class TestIncDec:
])
def test_no_number(self, url):
with pytest.raises(navigate.Error):
- navigate.incdec(QUrl(url), 1, "increment")
+ navigate.incdec(core.QUrl(url), 1, "increment")
@pytest.mark.parametrize('url, count', [
('http://example.com/page_0.html', 1),
@@ -168,15 +168,15 @@ class TestIncDec:
])
def test_number_below_0(self, url, count):
with pytest.raises(navigate.Error):
- navigate.incdec(QUrl(url), count, 'decrement')
+ navigate.incdec(core.QUrl(url), count, 'decrement')
def test_invalid_url(self):
with pytest.raises(urlutils.InvalidUrlError):
- navigate.incdec(QUrl(), 1, "increment")
+ navigate.incdec(core.QUrl(), 1, "increment")
def test_wrong_mode(self):
"""Test if incdec rejects a wrong parameter for inc_or_dec."""
- valid_url = QUrl("http://example.com/0")
+ valid_url = core.QUrl("http://example.com/0")
with pytest.raises(ValueError):
navigate.incdec(valid_url, 1, "foobar")
@@ -192,15 +192,15 @@ class TestUp:
])
def test_up(self, url_suffix, count, expected_suffix):
url_base = 'https://example.com'
- url = QUrl(url_base + url_suffix)
+ url = core.QUrl(url_base + url_suffix)
assert url.isValid()
new = navigate.path_up(url, count)
- assert new == QUrl(url_base + expected_suffix)
+ assert new == core.QUrl(url_base + expected_suffix)
def test_invalid_url(self):
with pytest.raises(urlutils.InvalidUrlError):
- navigate.path_up(QUrl(), count=1)
+ navigate.path_up(core.QUrl(), count=1)
class TestStrip:
@@ -212,17 +212,17 @@ class TestStrip:
])
def test_strip(self, url_suffix):
url_base = 'https://example.com/test'
- url = QUrl(url_base + url_suffix)
+ url = core.QUrl(url_base + url_suffix)
assert url.isValid()
stripped = navigate.strip(url, count=1)
assert stripped.isValid()
- assert stripped == QUrl(url_base)
+ assert stripped == core.QUrl(url_base)
def test_count(self):
with pytest.raises(navigate.Error, match='Count is not supported'):
- navigate.strip(QUrl('https://example.com/'), count=2)
+ navigate.strip(core.QUrl('https://example.com/'), count=2)
def test_invalid_url(self):
with pytest.raises(urlutils.InvalidUrlError):
- navigate.strip(QUrl(), count=1)
+ navigate.strip(core.QUrl(), count=1)
diff --git a/tests/unit/browser/test_notification.py b/tests/unit/browser/test_notification.py
index 8cbe3bc39..6d0966cb9 100644
--- a/tests/unit/browser/test_notification.py
+++ b/tests/unit/browser/test_notification.py
@@ -25,16 +25,15 @@ import inspect
from typing import List, Dict, Any, Optional, TYPE_CHECKING
import pytest
-from qutebrowser.qt.core import pyqtSignal, pyqtSlot, QUrl, QObject
-from qutebrowser.qt.gui import QImage
-from qutebrowser.qt.dbus import QDBusMessage, QDBus, QDBusConnection
+from qutebrowser.qt import webenginecore, gui
pytest.importorskip("qutebrowser.qt.webenginecore")
if TYPE_CHECKING:
- from qutebrowser.qt.webenginecore import QWebEngineNotification
+ from qutebrowser.qt import QWebEngineNotification
from qutebrowser.config import configdata
from qutebrowser.misc import objects
from qutebrowser.browser.webengine import notification
+from qutebrowser.qt import dbus, core
class FakeDBusMessage:
@@ -43,7 +42,7 @@ class FakeDBusMessage:
self,
signature: str,
*arguments: Any,
- typ: QDBusMessage.MessageType = QDBusMessage.MessageType.ReplyMessage,
+ typ: dbus.QDBusMessage.MessageType = dbus.QDBusMessage.MessageType.ReplyMessage,
error_name: Optional[str] = None,
) -> None:
self._signature = signature
@@ -57,7 +56,7 @@ class FakeDBusMessage:
def signature(self) -> str:
return self._signature
- def type(self) -> QDBusMessage.MessageType:
+ def type(self) -> dbus.QDBusMessage.MessageType:
return self._type
def errorName(self) -> str:
@@ -73,7 +72,7 @@ class FakeDBusMessage:
return cls(
"s",
f"error argument: {error_name}",
- typ=QDBusMessage.MessageType.ErrorMessage,
+ typ=dbus.QDBusMessage.MessageType.ErrorMessage,
error_name=error_name,
)
@@ -87,7 +86,7 @@ class FakeDBusInterface:
service: str,
path: str,
interface: str,
- bus: QDBusConnection,
+ bus: dbus.QDBusConnection,
) -> None:
assert service.startswith(notification.DBusNotificationAdapter.TEST_SERVICE)
assert path == notification.DBusNotificationAdapter.PATH
@@ -98,7 +97,7 @@ class FakeDBusInterface:
def isValid(self) -> bool:
return True
- def call(self, mode: QDBus.CallMode, method: str, *args: Any) -> FakeDBusMessage:
+ def call(self, mode: dbus.QDBus.CallMode, method: str, *args: Any) -> FakeDBusMessage:
meth = getattr(self, f"_call_{method}")
return meth(*args)
@@ -120,15 +119,15 @@ class FakeDBusInterface:
return self.notify_reply
-class FakeWebEngineNotification(QObject):
+class FakeWebEngineNotification(core.QObject):
- closed = pyqtSignal()
+ closed = core.pyqtSignal()
- def origin(self) -> QUrl:
- return QUrl("https://example.org")
+ def origin(self) -> core.QUrl:
+ return core.QUrl("https://example.org")
- def icon(self) -> QImage:
- return QImage()
+ def icon(self) -> gui.QImage:
+ return gui.QImage()
def title(self) -> str:
return "notification title"
@@ -180,7 +179,7 @@ class FakeNotificationAdapter(notification.AbstractNotificationAdapter):
self.presented.append(qt_notification)
return next(self.id_gen)
- @pyqtSlot(int)
+ @core.pyqtSlot(int)
def on_web_closed(self, notification_id: int) -> None:
"""Called when a notification was closed by the website."""
raise NotImplementedError
diff --git a/tests/unit/browser/test_pdfjs.py b/tests/unit/browser/test_pdfjs.py
index e9ca51796..0764937cd 100644
--- a/tests/unit/browser/test_pdfjs.py
+++ b/tests/unit/browser/test_pdfjs.py
@@ -21,7 +21,7 @@ import logging
import os.path
import pytest
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import core
from qutebrowser.browser import pdfjs
from qutebrowser.utils import urlmatch
@@ -47,7 +47,7 @@ def test_generate_pdfjs_page(available, snippet, monkeypatch):
else:
monkeypatch.setattr(pdfjs, 'is_available', lambda: False)
- content = pdfjs.generate_pdfjs_page('example.pdf', QUrl())
+ content = pdfjs.generate_pdfjs_page('example.pdf', core.QUrl())
print(content)
assert snippet in content
@@ -137,7 +137,7 @@ class TestResources:
(data_tmpdir / 'pdfjs' / 'pdf.js').ensure() # But no viewer.html
- content = pdfjs.generate_pdfjs_page('example.pdf', QUrl())
+ content = pdfjs.generate_pdfjs_page('example.pdf', core.QUrl())
assert '<h1>No pdf.js installation found</h1>' in content
@@ -221,7 +221,7 @@ def test_is_available(available, mocker):
])
def test_should_use_pdfjs(mimetype, url, enabled, expected, config_stub):
config_stub.val.content.pdfjs = enabled
- assert pdfjs.should_use_pdfjs(mimetype, QUrl(url)) == expected
+ assert pdfjs.should_use_pdfjs(mimetype, core.QUrl(url)) == expected
@pytest.mark.parametrize('url, expected', [
@@ -232,11 +232,11 @@ def test_should_use_pdfjs_url_pattern(config_stub, url, expected):
config_stub.val.content.pdfjs = False
pattern = urlmatch.UrlPattern('http://example.com')
config_stub.set_obj('content.pdfjs', True, pattern=pattern)
- assert pdfjs.should_use_pdfjs('application/pdf', QUrl(url)) == expected
+ assert pdfjs.should_use_pdfjs('application/pdf', core.QUrl(url)) == expected
def test_get_main_url():
- expected = QUrl('qute://pdfjs/web/viewer.html?filename=hello?world.pdf&'
+ expected = core.QUrl('qute://pdfjs/web/viewer.html?filename=hello?world.pdf&'
'file=&source=http://a.com/hello?world.pdf')
- original_url = QUrl('http://a.com/hello?world.pdf')
+ original_url = core.QUrl('http://a.com/hello?world.pdf')
assert pdfjs.get_main_url('hello?world.pdf', original_url) == expected
diff --git a/tests/unit/browser/test_qutescheme.py b/tests/unit/browser/test_qutescheme.py
index 499b2c584..05badd7eb 100644
--- a/tests/unit/browser/test_qutescheme.py
+++ b/tests/unit/browser/test_qutescheme.py
@@ -24,12 +24,12 @@ import time
import logging
import py.path # pylint: disable=no-name-in-module
-from qutebrowser.qt.core import QUrl, QUrlQuery
import pytest
from qutebrowser.browser import qutescheme, pdfjs, downloads
from qutebrowser.utils import resources, urlmatch
from qutebrowser.misc import guiprocess
+from qutebrowser.qt import core
class TestJavascriptHandler:
@@ -56,19 +56,19 @@ class TestJavascriptHandler:
@pytest.mark.parametrize("filename, content", js_files)
def test_qutejavascript(self, filename, content):
- url = QUrl("qute://javascript/{}".format(filename))
+ url = core.QUrl("qute://javascript/{}".format(filename))
_mimetype, data = qutescheme.qute_javascript(url)
assert data == content
def test_qutejavascript_404(self):
- url = QUrl("qute://javascript/404.js")
+ url = core.QUrl("qute://javascript/404.js")
with pytest.raises(qutescheme.SchemeOSError):
qutescheme.data_for_url(url)
def test_qutejavascript_empty_query(self):
- url = QUrl("qute://javascript")
+ url = core.QUrl("qute://javascript")
with pytest.raises(qutescheme.UrlInvalidError):
qutescheme.qute_javascript(url)
@@ -80,12 +80,12 @@ class TestProcessHandler:
def test_invalid_pid(self):
with pytest.raises(qutescheme.UrlInvalidError, match='Invalid PID blah'):
- qutescheme.qute_process(QUrl('qute://process/blah'))
+ qutescheme.qute_process(core.QUrl('qute://process/blah'))
def test_missing_process(self, monkeypatch):
monkeypatch.setattr(guiprocess, 'all_processes', {})
with pytest.raises(qutescheme.NotFoundError, match='No process 1234'):
- qutescheme.qute_process(QUrl('qute://process/1234'))
+ qutescheme.qute_process(core.QUrl('qute://process/1234'))
def test_existing_process(self, qtbot, py_proc):
proc = guiprocess.GUIProcess('testprocess')
@@ -93,7 +93,7 @@ class TestProcessHandler:
with qtbot.wait_signal(proc.finished, timeout=5000):
proc.start(*py_proc("print('AT&T')"))
- _mimetype, data = qutescheme.qute_process(QUrl(f'qute://process/{proc.pid}'))
+ _mimetype, data = qutescheme.qute_process(core.QUrl(f'qute://process/{proc.pid}'))
print(data)
assert f'<title>Process {proc.pid}</title>' in data
@@ -122,7 +122,7 @@ class TestHistoryHandler:
for i in range(entry_count):
entry_atime = now - i * interval
entry = {"atime": str(entry_atime),
- "url": QUrl("http://www.x.com/" + str(i)),
+ "url": core.QUrl("http://www.x.com/" + str(i)),
"title": "Page " + str(i)}
items.insert(0, entry)
@@ -144,7 +144,7 @@ class TestHistoryHandler:
now):
"""Ensure qute://history/data returns correct items."""
start_time = now - start_time_offset
- url = QUrl("qute://history/data?start_time=" + str(start_time))
+ url = core.QUrl("qute://history/data?start_time=" + str(start_time))
_mimetype, data = qutescheme.qute_history(url)
items = json.loads(data)
@@ -160,7 +160,7 @@ class TestHistoryHandler:
"""Make sure the completion.web_history.exclude setting is not used."""
config_stub.val.completion.web_history.exclude = ['www.x.com']
- url = QUrl("qute://history/data?start_time={}".format(now))
+ url = core.QUrl("qute://history/data?start_time={}".format(now))
_mimetype, data = qutescheme.qute_history(url)
items = json.loads(data)
assert items
@@ -175,7 +175,7 @@ class TestHistoryHandler:
}
web_history.insert_batch(entries)
- url = QUrl("qute://history/data?start_time={}".format(now))
+ url = core.QUrl("qute://history/data?start_time={}".format(now))
_mimetype, data = benchmark(qutescheme.qute_history, url)
assert len(json.loads(data)) > 1
@@ -202,7 +202,7 @@ class TestHelpHandler:
def test_unknown_file_type(self, data_patcher):
data_patcher('html/doc/foo.bin', b'\xff')
- mimetype, data = qutescheme.qute_help(QUrl('qute://help/foo.bin'))
+ mimetype, data = qutescheme.qute_help(core.QUrl('qute://help/foo.bin'))
assert mimetype == 'application/octet-stream'
assert data == b'\xff'
@@ -229,14 +229,14 @@ class TestPDFJSHandler:
def test_existing_resource(self):
"""Test with a resource that exists."""
_mimetype, data = qutescheme.data_for_url(
- QUrl('qute://pdfjs/existing/file.html'))
+ core.QUrl('qute://pdfjs/existing/file.html'))
assert data == b'foobar'
def test_nonexisting_resource(self, caplog):
"""Test with a resource that does not exist."""
with caplog.at_level(logging.WARNING, 'misc'):
with pytest.raises(qutescheme.NotFoundError):
- qutescheme.data_for_url(QUrl('qute://pdfjs/no/file.html'))
+ qutescheme.data_for_url(core.QUrl('qute://pdfjs/no/file.html'))
expected = 'pdfjs resource requested but not found: /no/file.html'
assert caplog.messages == [expected]
@@ -253,40 +253,40 @@ class TestPDFJSHandler:
f.write('<pdf content>')
_mimetype, data = qutescheme.data_for_url(
- QUrl('qute://pdfjs/web/viewer.html?filename=' + filename))
+ core.QUrl('qute://pdfjs/web/viewer.html?filename=' + filename))
assert b'PDF.js' in data
def test_viewer_no_filename(self):
with pytest.raises(qutescheme.UrlInvalidError,
match='Missing filename'):
- qutescheme.data_for_url(QUrl('qute://pdfjs/web/viewer.html'))
+ qutescheme.data_for_url(core.QUrl('qute://pdfjs/web/viewer.html'))
def test_viewer_inexistent_file(self):
with pytest.raises(qutescheme.Redirect):
- qutescheme.data_for_url(QUrl('qute://pdfjs/web/viewer.html?'
+ qutescheme.data_for_url(core.QUrl('qute://pdfjs/web/viewer.html?'
'filename=foobar&source=example.org'))
def test_viewer_inexistent_file_no_source(self):
with pytest.raises(qutescheme.UrlInvalidError,
match='Missing source'):
qutescheme.data_for_url(
- QUrl('qute://pdfjs/web/viewer.html?filename=foobar'))
+ core.QUrl('qute://pdfjs/web/viewer.html?filename=foobar'))
def test_file(self, download_tmpdir):
"""Load a file via qute://pdfjs/file."""
(download_tmpdir / 'testfile').write_binary(b'foo')
_mimetype, data = qutescheme.data_for_url(
- QUrl('qute://pdfjs/file?filename=testfile'))
+ core.QUrl('qute://pdfjs/file?filename=testfile'))
assert data == b'foo'
def test_file_no_filename(self):
with pytest.raises(qutescheme.UrlInvalidError):
- qutescheme.data_for_url(QUrl('qute://pdfjs/file'))
+ qutescheme.data_for_url(core.QUrl('qute://pdfjs/file'))
@pytest.mark.parametrize('sep', ['/', os.sep])
def test_file_pathsep(self, sep):
- url = QUrl('qute://pdfjs/file')
- query = QUrlQuery()
+ url = core.QUrl('qute://pdfjs/file')
+ query = core.QUrlQuery()
query.addQueryItem('filename', 'foo{}bar'.format(sep))
url.setQuery(query)
with pytest.raises(qutescheme.RequestDeniedError):
@@ -317,11 +317,11 @@ class TestQuteConfigdiff:
)
])
def test_default_config(self, config_stub, url, expected):
- _mimetype, data = qutescheme.data_for_url(QUrl(url))
+ _mimetype, data = qutescheme.data_for_url(core.QUrl(url))
assert data == expected
def test_changes(self, config_stub):
config_stub.set_obj("content.images", False)
- url = QUrl('qute://configdiff/')
+ url = core.QUrl('qute://configdiff/')
_mimetype, data = qutescheme.data_for_url(url)
assert data == b'content.images = false'
diff --git a/tests/unit/browser/test_signalfilter.py b/tests/unit/browser/test_signalfilter.py
index 05e02bfd5..f2e0b370f 100644
--- a/tests/unit/browser/test_signalfilter.py
+++ b/tests/unit/browser/test_signalfilter.py
@@ -23,25 +23,25 @@ import logging
import dataclasses
import pytest
-from qutebrowser.qt.core import pyqtSignal, pyqtSlot, QObject
from qutebrowser.browser import signalfilter
+from qutebrowser.qt import core
-class Signaller(QObject):
+class Signaller(core.QObject):
- signal = pyqtSignal(str)
- link_hovered = pyqtSignal(str)
+ signal = core.pyqtSignal(str)
+ link_hovered = core.pyqtSignal(str)
- filtered_signal = pyqtSignal(str)
- cur_link_hovered = pyqtSignal(str)
+ filtered_signal = core.pyqtSignal(str)
+ cur_link_hovered = core.pyqtSignal(str)
def __init__(self, parent=None):
super().__init__(parent)
self.filtered_signal_arg = None
self.filtered_signal.connect(self.filtered_signal_slot)
- @pyqtSlot(str)
+ @core.pyqtSlot(str)
def filtered_signal_slot(self, s):
self.filtered_signal_arg = s
diff --git a/tests/unit/browser/test_urlmarks.py b/tests/unit/browser/test_urlmarks.py
index d2bac7692..18ec166ab 100644
--- a/tests/unit/browser/test_urlmarks.py
+++ b/tests/unit/browser/test_urlmarks.py
@@ -22,7 +22,7 @@
import unittest.mock
import pytest
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import core
from qutebrowser.browser import urlmarks
@@ -63,13 +63,13 @@ def test_add(bm_file, fake_save_manager, qtbot):
bm = urlmarks.BookmarkManager()
with qtbot.wait_signal(bm.changed):
- bm.add(QUrl('http://example.com'), 'Example Site')
+ bm.add(core.QUrl('http://example.com'), 'Example Site')
assert list(bm.marks.items()) == [
('http://example.com', 'Example Site'),
]
with qtbot.wait_signal(bm.changed):
- bm.add(QUrl('http://example.com/notitle'), '')
+ bm.add(core.QUrl('http://example.com/notitle'), '')
assert list(bm.marks.items()) == [
('http://example.com', 'Example Site'),
('http://example.com/notitle', ''),
@@ -80,32 +80,32 @@ def test_add_toggle(bm_file, fake_save_manager, qtbot):
bm = urlmarks.BookmarkManager()
with qtbot.wait_signal(bm.changed):
- bm.add(QUrl('http://example.com'), '', toggle=True)
+ bm.add(core.QUrl('http://example.com'), '', toggle=True)
assert 'http://example.com' in bm.marks
with qtbot.wait_signal(bm.changed):
- bm.add(QUrl('http://example.com'), '', toggle=True)
+ bm.add(core.QUrl('http://example.com'), '', toggle=True)
assert 'http://example.com' not in bm.marks
with qtbot.wait_signal(bm.changed):
- bm.add(QUrl('http://example.com'), '', toggle=True)
+ bm.add(core.QUrl('http://example.com'), '', toggle=True)
assert 'http://example.com' in bm.marks
def test_add_dupe(bm_file, fake_save_manager, qtbot):
bm = urlmarks.BookmarkManager()
- bm.add(QUrl('http://example.com'), '')
+ bm.add(core.QUrl('http://example.com'), '')
with pytest.raises(urlmarks.AlreadyExistsError):
- bm.add(QUrl('http://example.com'), '')
+ bm.add(core.QUrl('http://example.com'), '')
def test_delete(bm_file, fake_save_manager, qtbot):
bm = urlmarks.BookmarkManager()
- bm.add(QUrl('http://example.com/foo'), 'Foo')
- bm.add(QUrl('http://example.com/bar'), 'Bar')
- bm.add(QUrl('http://example.com/baz'), 'Baz')
+ bm.add(core.QUrl('http://example.com/foo'), 'Foo')
+ bm.add(core.QUrl('http://example.com/bar'), 'Bar')
+ bm.add(core.QUrl('http://example.com/baz'), 'Baz')
bm.save()
with qtbot.wait_signal(bm.changed):
@@ -119,8 +119,8 @@ def test_delete(bm_file, fake_save_manager, qtbot):
def test_save(bm_file, fake_save_manager, qtbot):
bm = urlmarks.BookmarkManager()
- bm.add(QUrl('http://example.com'), 'Example Site')
- bm.add(QUrl('http://example.com/notitle'), '')
+ bm.add(core.QUrl('http://example.com'), 'Example Site')
+ bm.add(core.QUrl('http://example.com/notitle'), '')
bm.save()
assert bm_file.read().splitlines() == [
'http://example.com Example Site',
diff --git a/tests/unit/browser/webengine/test_webengine_cookies.py b/tests/unit/browser/webengine/test_webengine_cookies.py
index ff8668ed3..7aa3e5b8d 100644
--- a/tests/unit/browser/webengine/test_webengine_cookies.py
+++ b/tests/unit/browser/webengine/test_webengine_cookies.py
@@ -18,9 +18,8 @@
# along with qutebrowser. If not, see <https://www.gnu.org/licenses/>.
import pytest
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import webenginecore, core
pytest.importorskip('qutebrowser.qt.webenginecore')
-from qutebrowser.qt.webenginecore import QWebEngineCookieStore, QWebEngineProfile
from qutebrowser.browser.webengine import cookies
from qutebrowser.utils import urlmatch
@@ -28,8 +27,8 @@ from qutebrowser.utils import urlmatch
@pytest.fixture
def filter_request():
- request = QWebEngineCookieStore.FilterRequest()
- request.firstPartyUrl = QUrl('https://example.com')
+ request = webenginecore.QWebEngineCookieStore.FilterRequest()
+ request.firstPartyUrl = core.QUrl('https://example.com')
return request
@@ -76,7 +75,7 @@ def test_invalid_url(config_stub, filter_request, global_value):
https://developers.google.com/youtube/youtube_player_demo
"""
config_stub.val.content.cookies.accept = global_value
- filter_request.firstPartyUrl = QUrl()
+ filter_request.firstPartyUrl = core.QUrl()
accepted = global_value == 'all'
assert cookies._accept_cookie(filter_request) == accepted
@@ -101,7 +100,7 @@ def test_logging(monkeypatch, config_stub, filter_request, caplog, enabled):
class TestInstall:
def test_real_profile(self):
- profile = QWebEngineProfile()
+ profile = webenginecore.QWebEngineProfile()
cookies.install_filter(profile)
def test_fake_profile(self, stubs):
diff --git a/tests/unit/browser/webengine/test_webenginedownloads.py b/tests/unit/browser/webengine/test_webenginedownloads.py
index 3902b9f2b..066637ee8 100644
--- a/tests/unit/browser/webengine/test_webenginedownloads.py
+++ b/tests/unit/browser/webengine/test_webenginedownloads.py
@@ -22,7 +22,7 @@ import dataclasses
import pytest
pytest.importorskip('qutebrowser.qt.webenginecore')
-from qutebrowser.qt.webenginecore import QWebEngineProfile
+from qutebrowser.qt import webenginecore
from qutebrowser.utils import urlutils, usertypes, utils
from qutebrowser.browser.webengine import webenginedownloads
@@ -103,7 +103,7 @@ class TestDataUrlWorkaround:
@pytest.fixture
def webengine_profile(self, qapp):
- profile = QWebEngineProfile.defaultProfile()
+ profile = webenginecore.QWebEngineProfile.defaultProfile()
profile.setParent(qapp)
return profile
diff --git a/tests/unit/browser/webengine/test_webengineinterceptor.py b/tests/unit/browser/webengine/test_webengineinterceptor.py
index f48d4a715..9a2963e9c 100644
--- a/tests/unit/browser/webengine/test_webengineinterceptor.py
+++ b/tests/unit/browser/webengine/test_webengineinterceptor.py
@@ -24,7 +24,7 @@ import pytest
pytest.importorskip('qutebrowser.qt.webenginecore')
-from qutebrowser.qt.webenginecore import QWebEngineUrlRequestInfo
+from qutebrowser.qt import webenginecore
from qutebrowser.browser.webengine import interceptor
from qutebrowser.utils import qtutils
@@ -35,8 +35,8 @@ def test_no_missing_resource_types():
request_interceptor = interceptor.RequestInterceptor()
qb_keys = set(request_interceptor._resource_types.keys())
qt_keys = set(testutils.enum_members(
- QWebEngineUrlRequestInfo,
- QWebEngineUrlRequestInfo.ResourceType,
+ webenginecore.QWebEngineUrlRequestInfo,
+ webenginecore.QWebEngineUrlRequestInfo.ResourceType,
).values())
assert qt_keys == qb_keys
diff --git a/tests/unit/browser/webengine/test_webview.py b/tests/unit/browser/webengine/test_webview.py
index 2ddcc8733..6cc908301 100644
--- a/tests/unit/browser/webengine/test_webview.py
+++ b/tests/unit/browser/webengine/test_webview.py
@@ -23,7 +23,7 @@ import dataclasses
import pytest
webview = pytest.importorskip('qutebrowser.browser.webengine.webview')
-from qutebrowser.qt.webenginecore import QWebEnginePage
+from qutebrowser.qt import webenginecore
from helpers import testutils
@@ -58,18 +58,18 @@ def test_camel_to_snake(naming, name, expected):
@pytest.mark.parametrize("enum_type, naming, mapping", [
(
- QWebEnginePage.JavaScriptConsoleMessageLevel,
+ webenginecore.QWebEnginePage.JavaScriptConsoleMessageLevel,
Naming(suffix="MessageLevel"),
webview.WebEnginePage._JS_LOG_LEVEL_MAPPING,
),
(
- QWebEnginePage.NavigationType,
+ webenginecore.QWebEnginePage.NavigationType,
Naming(prefix="NavigationType"),
webview.WebEnginePage._NAVIGATION_TYPE_MAPPING,
)
])
def test_enum_mappings(enum_type, naming, mapping):
- members = testutils.enum_members(QWebEnginePage, enum_type).items()
+ members = testutils.enum_members(webenginecore.QWebEnginePage, enum_type).items()
for name, val in members:
mapped = mapping[val]
assert camel_to_snake(naming, name) == mapped.name
diff --git a/tests/unit/browser/webkit/http/test_http.py b/tests/unit/browser/webkit/http/test_http.py
index 3e1a23105..d4556aa53 100644
--- a/tests/unit/browser/webkit/http/test_http.py
+++ b/tests/unit/browser/webkit/http/test_http.py
@@ -24,7 +24,7 @@ import logging
import pytest
import hypothesis
from hypothesis import strategies
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import core
from qutebrowser.browser.webkit import http
@@ -38,7 +38,7 @@ from qutebrowser.browser.webkit import http
('http://example.com/', 'qutebrowser-download'),
])
def test_no_content_disposition(stubs, url, expected):
- reply = stubs.FakeNetworkReply(url=QUrl(url))
+ reply = stubs.FakeNetworkReply(url=core.QUrl(url))
inline, filename = http.parse_content_disposition(reply)
assert inline
assert filename == expected
diff --git a/tests/unit/browser/webkit/network/test_filescheme.py b/tests/unit/browser/webkit/network/test_filescheme.py
index 3f0a4dfa0..3eb9c94cc 100644
--- a/tests/unit/browser/webkit/network/test_filescheme.py
+++ b/tests/unit/browser/webkit/network/test_filescheme.py
@@ -24,8 +24,7 @@ from typing import List
import pytest
import bs4
-from qutebrowser.qt.core import QUrl
-from qutebrowser.qt.network import QNetworkRequest
+from qutebrowser.qt import network, core
from qutebrowser.browser.webkit.network import filescheme
from qutebrowser.utils import urlutils, utils
@@ -257,8 +256,8 @@ class TestDirbrowserHtml:
class TestFileSchemeHandler:
def test_dir(self, tmpdir):
- url = QUrl.fromLocalFile(str(tmpdir))
- req = QNetworkRequest(url)
+ url = core.QUrl.fromLocalFile(str(tmpdir))
+ req = network.QNetworkRequest(url)
reply = filescheme.handler(req, None, None)
# The URL will always use /, even on Windows - so we force this here
# too.
@@ -268,14 +267,14 @@ class TestFileSchemeHandler:
def test_file(self, tmpdir):
filename = tmpdir / 'foo'
filename.ensure()
- url = QUrl.fromLocalFile(str(filename))
- req = QNetworkRequest(url)
+ url = core.QUrl.fromLocalFile(str(filename))
+ req = network.QNetworkRequest(url)
reply = filescheme.handler(req, None, None)
assert reply is None
def test_unicode_encode_error(self, mocker):
- url = QUrl('file:///tmp/foo')
- req = QNetworkRequest(url)
+ url = core.QUrl('file:///tmp/foo')
+ req = network.QNetworkRequest(url)
err = UnicodeEncodeError('ascii', '', 0, 2, 'foo')
mocker.patch('os.path.isdir', side_effect=err)
diff --git a/tests/unit/browser/webkit/network/test_networkreply.py b/tests/unit/browser/webkit/network/test_networkreply.py
index fc400c1b2..27064baa4 100644
--- a/tests/unit/browser/webkit/network/test_networkreply.py
+++ b/tests/unit/browser/webkit/network/test_networkreply.py
@@ -21,15 +21,13 @@
import pytest
-from qutebrowser.qt.core import QUrl, QIODevice
-from qutebrowser.qt.network import QNetworkRequest, QNetworkReply
-
from qutebrowser.browser.webkit.network import networkreply
+from qutebrowser.qt import network, core
@pytest.fixture
def req():
- return QNetworkRequest(QUrl('http://www.qutebrowser.org/'))
+ return network.QNetworkRequest(core.QUrl('http://www.qutebrowser.org/'))
class TestFixedDataNetworkReply:
@@ -38,11 +36,11 @@ class TestFixedDataNetworkReply:
reply = networkreply.FixedDataNetworkReply(req, b'', 'test/foo')
assert reply.request() == req
assert reply.url() == req.url()
- assert reply.openMode() == QIODevice.OpenModeFlag.ReadOnly
- assert reply.header(QNetworkRequest.KnownHeaders.ContentTypeHeader) == 'test/foo'
- http_code = reply.attribute(QNetworkRequest.Attribute.HttpStatusCodeAttribute)
+ assert reply.openMode() == core.QIODevice.OpenModeFlag.ReadOnly
+ assert reply.header(network.QNetworkRequest.KnownHeaders.ContentTypeHeader) == 'test/foo'
+ http_code = reply.attribute(network.QNetworkRequest.Attribute.HttpStatusCodeAttribute)
http_reason = reply.attribute(
- QNetworkRequest.Attribute.HttpReasonPhraseAttribute)
+ network.QNetworkRequest.Attribute.HttpReasonPhraseAttribute)
assert http_code == 200
assert http_reason == 'OK'
assert reply.isFinished()
@@ -76,7 +74,7 @@ class TestFixedDataNetworkReply:
def test_error_network_reply(qtbot, req):
reply = networkreply.ErrorNetworkReply(
- req, "This is an error", QNetworkReply.NetworkError.UnknownNetworkError)
+ req, "This is an error", network.QNetworkReply.NetworkError.UnknownNetworkError)
with qtbot.wait_signals([reply.errorOccurred, reply.finished], order='strict'):
pass
@@ -84,18 +82,18 @@ def test_error_network_reply(qtbot, req):
reply.abort() # shouldn't do anything
assert reply.request() == req
assert reply.url() == req.url()
- assert reply.openMode() == QIODevice.OpenModeFlag.ReadOnly
+ assert reply.openMode() == core.QIODevice.OpenModeFlag.ReadOnly
assert reply.isFinished()
assert not reply.isRunning()
assert reply.bytesAvailable() == 0
assert reply.readData(1) == b''
- assert reply.error() == QNetworkReply.NetworkError.UnknownNetworkError
+ assert reply.error() == network.QNetworkReply.NetworkError.UnknownNetworkError
assert reply.errorString() == "This is an error"
def test_redirect_network_reply():
- url = QUrl('https://www.example.com/')
+ url = core.QUrl('https://www.example.com/')
reply = networkreply.RedirectNetworkReply(url)
assert reply.readData(1) == b''
- assert reply.attribute(QNetworkRequest.Attribute.RedirectionTargetAttribute) == url
+ assert reply.attribute(network.QNetworkRequest.Attribute.RedirectionTargetAttribute) == url
reply.abort() # shouldn't do anything
diff --git a/tests/unit/browser/webkit/network/test_pac.py b/tests/unit/browser/webkit/network/test_pac.py
index 8b9e29912..942668838 100644
--- a/tests/unit/browser/webkit/network/test_pac.py
+++ b/tests/unit/browser/webkit/network/test_pac.py
@@ -22,9 +22,7 @@ import threading
import logging
import pytest
-from qutebrowser.qt.core import QUrl
-from qutebrowser.qt.network import (QNetworkProxy, QNetworkProxyQuery, QHostInfo,
- QHostAddress)
+from qutebrowser.qt import network, core
from qutebrowser.browser.network import pac
@@ -42,13 +40,13 @@ def _pac_common_test(test_str):
fun_str = fun_str_f.format(test_str)
res = pac.PACResolver(fun_str)
- proxies = res.resolve(QNetworkProxyQuery(QUrl("https://example.com/test")))
+ proxies = res.resolve(network.QNetworkProxyQuery(core.QUrl("https://example.com/test")))
assert len(proxies) == 3
- assert proxies[0].type() == QNetworkProxy.ProxyType.NoProxy
- assert proxies[1].type() == QNetworkProxy.ProxyType.HttpProxy
+ assert proxies[0].type() == network.QNetworkProxy.ProxyType.NoProxy
+ assert proxies[1].type() == network.QNetworkProxy.ProxyType.HttpProxy
assert proxies[1].hostName() == "127.0.0.1"
assert proxies[1].port() == 8080
- assert proxies[2].type() == QNetworkProxy.ProxyType.Socks5Proxy
+ assert proxies[2].type() == network.QNetworkProxy.ProxyType.Socks5Proxy
assert proxies[2].hostName() == "192.168.1.1"
assert proxies[2].port() == 4444
@@ -96,11 +94,11 @@ def _pac_noexcept_test(call):
])
def test_dnsResolve(monkeypatch, domain, expected):
def mock_fromName(host):
- info = QHostInfo()
+ info = network.QHostInfo()
if host == "known.domain":
- info.setAddresses([QHostAddress("1.2.3.4")])
+ info.setAddresses([network.QHostAddress("1.2.3.4")])
return info
- monkeypatch.setattr(QHostInfo, 'fromName', mock_fromName)
+ monkeypatch.setattr(network.QHostInfo, 'fromName', mock_fromName)
_pac_equality_test("dnsResolve('{}')".format(domain), expected)
@@ -130,7 +128,7 @@ def test_invalid_port():
res = pac.PACResolver(test_str)
with pytest.raises(pac.ParseProxyError):
- res.resolve(QNetworkProxyQuery(QUrl("https://example.com/test")))
+ res.resolve(network.QNetworkProxyQuery(core.QUrl("https://example.com/test")))
@pytest.mark.parametrize('string', ["", "{"])
@@ -155,7 +153,7 @@ def test_fail_parse(value):
res = pac.PACResolver(test_str_f.format(value))
with pytest.raises(pac.ParseProxyError):
- res.resolve(QNetworkProxyQuery(QUrl("https://example.com/test")))
+ res.resolve(network.QNetworkProxyQuery(core.QUrl("https://example.com/test")))
def test_fail_return():
@@ -167,7 +165,7 @@ def test_fail_return():
res = pac.PACResolver(test_str)
with pytest.raises(pac.EvalProxyError):
- res.resolve(QNetworkProxyQuery(QUrl("https://example.com/test")))
+ res.resolve(network.QNetworkProxyQuery(core.QUrl("https://example.com/test")))
@pytest.mark.parametrize('url, has_secret', [
@@ -202,7 +200,7 @@ def test_secret_url(url, has_secret, from_file):
}}
""".format('true' if (has_secret or from_file) else 'false')
res = pac.PACResolver(test_str)
- res.resolve(QNetworkProxyQuery(QUrl(url)), from_file=from_file)
+ res.resolve(network.QNetworkProxyQuery(core.QUrl(url)), from_file=from_file)
def test_logging(qtlog):
@@ -214,7 +212,7 @@ def test_logging(qtlog):
}
"""
res = pac.PACResolver(test_str)
- res.resolve(QNetworkProxyQuery(QUrl("https://example.com/test")))
+ res.resolve(network.QNetworkProxyQuery(core.QUrl("https://example.com/test")))
assert len(qtlog.records) == 1
assert qtlog.records[0].message == 'logging test'
@@ -241,7 +239,7 @@ def fetcher_test(test_str):
serve_thread.start()
try:
ready_event.wait()
- fetcher = pac.PACFetcher(QUrl("pac+http://127.0.0.1:8081"))
+ fetcher = pac.PACFetcher(core.QUrl("pac+http://127.0.0.1:8081"))
fetcher.fetch()
assert fetcher.fetch_error() is None
finally:
@@ -257,7 +255,7 @@ def test_fetch_success():
"""
res = fetcher_test(test_str)
- proxies = res.resolve(QNetworkProxyQuery(QUrl("https://example.com/test")))
+ proxies = res.resolve(network.QNetworkProxyQuery(core.QUrl("https://example.com/test")))
assert len(proxies) == 3
@@ -270,6 +268,6 @@ def test_fetch_evalerror(caplog):
res = fetcher_test(test_str)
with caplog.at_level(logging.ERROR):
- proxies = res.resolve(QNetworkProxyQuery(QUrl("https://example.com/test")))
+ proxies = res.resolve(network.QNetworkProxyQuery(core.QUrl("https://example.com/test")))
assert len(proxies) == 1
assert proxies[0].port() == 9
diff --git a/tests/unit/browser/webkit/test_cache.py b/tests/unit/browser/webkit/test_cache.py
index 90715ec21..8bfadce58 100644
--- a/tests/unit/browser/webkit/test_cache.py
+++ b/tests/unit/browser/webkit/test_cache.py
@@ -19,10 +19,9 @@
# along with qutebrowser. If not, see <https://www.gnu.org/licenses/>.
import pytest
-from qutebrowser.qt.core import QUrl, QDateTime
-from qutebrowser.qt.network import QNetworkDiskCache, QNetworkCacheMetaData
from qutebrowser.browser.webkit import cache
+from qutebrowser.qt import network, core
@pytest.fixture
@@ -31,8 +30,8 @@ def disk_cache(tmpdir, config_stub):
def preload_cache(cache, url='http://www.example.com/', content=b'foobar'):
- metadata = QNetworkCacheMetaData()
- metadata.setUrl(QUrl(url))
+ metadata = network.QNetworkCacheMetaData()
+ metadata.setUrl(core.QUrl(url))
assert metadata.isValid()
device = cache.prepare(metadata)
assert device is not None
@@ -74,8 +73,8 @@ def test_cache_existing_metadata_file(tmpdir, disk_cache):
url = 'http://qutebrowser.org'
content = b'foobar'
- metadata = QNetworkCacheMetaData()
- metadata.setUrl(QUrl(url))
+ metadata = network.QNetworkCacheMetaData()
+ metadata.setUrl(core.QUrl(url))
assert metadata.isValid()
device = disk_cache.prepare(metadata)
@@ -99,7 +98,7 @@ def test_cache_get_nonexistent_data(disk_cache):
"""Test querying some data that was never inserted."""
preload_cache(disk_cache, 'https://qutebrowser.org')
- assert disk_cache.data(QUrl('http://qutebrowser.org')) is None
+ assert disk_cache.data(core.QUrl('http://qutebrowser.org')) is None
def test_cache_insert_data(disk_cache):
@@ -111,7 +110,7 @@ def test_cache_insert_data(disk_cache):
preload_cache(disk_cache, url, content)
assert disk_cache.cacheSize() != 0
- assert disk_cache.data(QUrl(url)).readAll() == content
+ assert disk_cache.data(core.QUrl(url)).readAll() == content
def test_cache_remove_data(disk_cache):
@@ -120,7 +119,7 @@ def test_cache_remove_data(disk_cache):
preload_cache(disk_cache, url)
assert disk_cache.cacheSize() > 0
- assert disk_cache.remove(QUrl(url))
+ assert disk_cache.remove(core.QUrl(url))
assert disk_cache.cacheSize() == 0
@@ -138,14 +137,14 @@ def test_cache_clear_activated(disk_cache):
def test_cache_metadata(disk_cache):
"""Ensure that DiskCache.metaData() returns exactly what was inserted."""
url = 'http://qutebrowser.org'
- metadata = QNetworkCacheMetaData()
- metadata.setUrl(QUrl(url))
+ metadata = network.QNetworkCacheMetaData()
+ metadata.setUrl(core.QUrl(url))
assert metadata.isValid()
device = disk_cache.prepare(metadata)
device.write(b'foobar')
disk_cache.insert(device)
- assert disk_cache.metaData(QUrl(url)) == metadata
+ assert disk_cache.metaData(core.QUrl(url)) == metadata
def test_cache_update_metadata(disk_cache):
@@ -154,16 +153,16 @@ def test_cache_update_metadata(disk_cache):
preload_cache(disk_cache, url, b'foo')
assert disk_cache.cacheSize() > 0
- metadata = QNetworkCacheMetaData()
- metadata.setUrl(QUrl(url))
+ metadata = network.QNetworkCacheMetaData()
+ metadata.setUrl(core.QUrl(url))
assert metadata.isValid()
disk_cache.updateMetaData(metadata)
- assert disk_cache.metaData(QUrl(url)) == metadata
+ assert disk_cache.metaData(core.QUrl(url)) == metadata
def test_cache_full(tmpdir):
"""Do a sanity test involving everything."""
- disk_cache = QNetworkDiskCache()
+ disk_cache = network.QNetworkDiskCache()
disk_cache.setCacheDirectory(str(tmpdir))
url = 'http://qutebrowser.org'
@@ -173,14 +172,14 @@ def test_cache_full(tmpdir):
content2 = b'ohmycert'
preload_cache(disk_cache, url2, content2)
- metadata = QNetworkCacheMetaData()
- metadata.setUrl(QUrl(url))
- soon = QDateTime.currentDateTime().addMonths(4)
+ metadata = network.QNetworkCacheMetaData()
+ metadata.setUrl(core.QUrl(url))
+ soon = core.QDateTime.currentDateTime().addMonths(4)
assert soon.isValid()
metadata.setLastModified(soon)
assert metadata.isValid()
disk_cache.updateMetaData(metadata)
- disk_cache.remove(QUrl(url2))
+ disk_cache.remove(core.QUrl(url2))
- assert disk_cache.metaData(QUrl(url)).lastModified() == soon
- assert disk_cache.data(QUrl(url)).readAll() == content
+ assert disk_cache.metaData(core.QUrl(url)).lastModified() == soon
+ assert disk_cache.data(core.QUrl(url)).readAll() == content
diff --git a/tests/unit/browser/webkit/test_certificateerror.py b/tests/unit/browser/webkit/test_certificateerror.py
index ad6d83262..c7edea5ab 100644
--- a/tests/unit/browser/webkit/test_certificateerror.py
+++ b/tests/unit/browser/webkit/test_certificateerror.py
@@ -18,8 +18,7 @@
# along with qutebrowser. If not, see <https://www.gnu.org/licenses/>.
import pytest
-from qutebrowser.qt.core import QUrl
-from qutebrowser.qt.network import QSslError
+from qutebrowser.qt import network, core
from qutebrowser.browser.webkit import certificateerror
@@ -35,13 +34,13 @@ class FakeError:
@pytest.mark.parametrize('errors, expected', [
(
- [QSslError(QSslError.SslError.UnableToGetIssuerCertificate)],
+ [network.QSslError(network.QSslError.SslError.UnableToGetIssuerCertificate)],
['<p>The issuer certificate could not be found</p>'],
),
(
[
- QSslError(QSslError.SslError.UnableToGetIssuerCertificate),
- QSslError(QSslError.SslError.UnableToDecryptCertificateSignature),
+ network.QSslError(network.QSslError.SslError.UnableToGetIssuerCertificate),
+ network.QSslError(network.QSslError.SslError.UnableToDecryptCertificateSignature),
],
[
'<ul>',
@@ -69,7 +68,7 @@ class FakeError:
),
])
def test_html(stubs, errors, expected):
- reply = stubs.FakeNetworkReply(url=QUrl("https://example.com"))
+ reply = stubs.FakeNetworkReply(url=core.QUrl("https://example.com"))
wrapper = certificateerror.CertificateErrorWrapper(reply=reply, errors=errors)
lines = [line.strip() for line in wrapper.html().splitlines() if line.strip()]
assert lines == expected
diff --git a/tests/unit/browser/webkit/test_cookies.py b/tests/unit/browser/webkit/test_cookies.py
index f2a64f3bc..5239f3443 100644
--- a/tests/unit/browser/webkit/test_cookies.py
+++ b/tests/unit/browser/webkit/test_cookies.py
@@ -18,8 +18,8 @@
# You should have received a copy of the GNU General Public License
# along with qutebrowser. If not, see <https://www.gnu.org/licenses/>.
-from qutebrowser.qt.network import QNetworkCookie
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import network
+from qutebrowser.qt import core
import pytest
from qutebrowser.browser.webkit import cookies
@@ -66,7 +66,7 @@ class TestSetCookies:
@pytest.fixture
def cookie(self):
- return QNetworkCookie(b'foo', b'bar')
+ return network.QNetworkCookie(b'foo', b'bar')
@pytest.fixture
def ram_jar(self):
@@ -74,7 +74,7 @@ class TestSetCookies:
@pytest.fixture
def url(self):
- return QUrl('http://example.com/')
+ return core.QUrl('http://example.com/')
@pytest.fixture(autouse=True)
def set_webkit_backend(self, monkeypatch):
@@ -110,7 +110,7 @@ class TestSetCookies:
config_stub.set_str('content.cookies.accept', 'never',
pattern=urlmatch.UrlPattern('http://example.com'))
- org_url = QUrl('http://example.org/')
+ org_url = core.QUrl('http://example.org/')
with qtbot.wait_signal(ram_jar.changed):
assert ram_jar.setCookiesFromUrl([cookie], org_url)
diff --git a/tests/unit/browser/webkit/test_tabhistory.py b/tests/unit/browser/webkit/test_tabhistory.py
index db9d1abcb..43788d0a2 100644
--- a/tests/unit/browser/webkit/test_tabhistory.py
+++ b/tests/unit/browser/webkit/test_tabhistory.py
@@ -27,40 +27,40 @@ from typing import Any
import pytest
pytest.importorskip('qutebrowser.qt.webkit')
-from qutebrowser.qt.core import QUrl, QPoint
-from qutebrowser.qt.webkit import QWebHistory
+from qutebrowser.qt import webkit
from qutebrowser.browser.webkit import tabhistory
from qutebrowser.misc.sessions import TabHistoryItem as Item
from qutebrowser.utils import qtutils
+from qutebrowser.qt import core
pytestmark = pytest.mark.qt_log_ignore('QIODevice::read.*: device not open')
ITEMS = [
- Item(QUrl('https://www.heise.de/'), 'heise'),
- Item(QUrl('about:blank'), 'blank', active=True),
- Item(QUrl('http://example.com/%E2%80%A6'), 'percent'),
- Item(QUrl('http://example.com/?foo=bar'), 'arg',
- original_url=QUrl('http://original.url.example.com/'),
+ Item(core.QUrl('https://www.heise.de/'), 'heise'),
+ Item(core.QUrl('about:blank'), 'blank', active=True),
+ Item(core.QUrl('http://example.com/%E2%80%A6'), 'percent'),
+ Item(core.QUrl('http://example.com/?foo=bar'), 'arg',
+ original_url=core.QUrl('http://original.url.example.com/'),
user_data={'foo': 23, 'bar': 42}),
# From https://github.com/OtterBrowser/otter-browser/issues/709#issuecomment-74749471
- Item(QUrl('http://github.com/OtterBrowser/24/134/2344/otter-browser/'
+ Item(core.QUrl('http://github.com/OtterBrowser/24/134/2344/otter-browser/'
'issues/709/'),
'Page not found | github',
- user_data={'zoom': 149, 'scroll-pos': QPoint(0, 0)}),
- Item(QUrl('https://mail.google.com/mail/u/0/#label/some+label/'
+ user_data={'zoom': 149, 'scroll-pos': core.QPoint(0, 0)}),
+ Item(core.QUrl('https://mail.google.com/mail/u/0/#label/some+label/'
'234lkjsd0932lkjf884jqwerdf4'),
'"some label" - email@gmail.com - Gmail"',
- user_data={'zoom': 120, 'scroll-pos': QPoint(0, 0)}),
+ user_data={'zoom': 120, 'scroll-pos': core.QPoint(0, 0)}),
]
@dataclasses.dataclass
class Objects:
- history: QWebHistory
+ history: webkit.QWebHistory
user_data: Any
@@ -128,16 +128,16 @@ def test_titles(objects, i, item):
def test_no_active_item():
"""Check tabhistory.serialize with no active item."""
- items = [Item(QUrl(), '')]
+ items = [Item(core.QUrl(), '')]
with pytest.raises(ValueError):
tabhistory.serialize(items)
def test_two_active_items():
"""Check tabhistory.serialize with two active items."""
- items = [Item(QUrl(), '', active=True),
- Item(QUrl(), ''),
- Item(QUrl(), '', active=True)]
+ items = [Item(core.QUrl(), '', active=True),
+ Item(core.QUrl(), ''),
+ Item(core.QUrl(), '', active=True)]
with pytest.raises(ValueError):
tabhistory.serialize(items)
diff --git a/tests/unit/browser/webkit/test_webkitelem.py b/tests/unit/browser/webkit/test_webkitelem.py
index c02af6b25..85947f03f 100644
--- a/tests/unit/browser/webkit/test_webkitelem.py
+++ b/tests/unit/browser/webkit/test_webkitelem.py
@@ -27,13 +27,14 @@ import itertools
import dataclasses
import pytest
-from qutebrowser.qt.core import QRect, QPoint, QUrl
QWebElement = pytest.importorskip('qutebrowser.qt.webkit').QWebElement
from qutebrowser.browser import browsertab
from qutebrowser.browser.webkit import webkitelem
from qutebrowser.misc import objects
from qutebrowser.utils import usertypes
+from qutebrowser.qt import core
+
if TYPE_CHECKING:
from helpers import stubs
@@ -488,19 +489,19 @@ class TestIsVisible:
@pytest.fixture
def frame(self, stubs):
- return stubs.FakeWebFrame(QRect(0, 0, 100, 100))
+ return stubs.FakeWebFrame(core.QRect(0, 0, 100, 100))
def test_invalid_frame_geometry(self, stubs):
"""Test with an invalid frame geometry."""
- rect = QRect(0, 0, 0, 0)
+ rect = core.QRect(0, 0, 0, 0)
assert not rect.isValid()
frame = stubs.FakeWebFrame(rect)
- elem = get_webelem(QRect(0, 0, 10, 10), frame)
+ elem = get_webelem(core.QRect(0, 0, 10, 10), frame)
assert not elem._is_visible(frame)
def test_invalid_invisible(self, frame):
"""Test elements with an invalid geometry which are invisible."""
- elem = get_webelem(QRect(0, 0, 0, 0), frame)
+ elem = get_webelem(core.QRect(0, 0, 0, 0), frame)
assert not elem.geometry().isValid()
assert elem.geometry().x() == 0
assert not elem._is_visible(frame)
@@ -511,17 +512,17 @@ class TestIsVisible:
This seems to happen sometimes in the real world, with real elements
which *are* visible, but don't have a valid geometry.
"""
- elem = get_webelem(QRect(10, 10, 0, 0), frame)
+ elem = get_webelem(core.QRect(10, 10, 0, 0), frame)
assert not elem.geometry().isValid()
assert elem._is_visible(frame)
@pytest.mark.parametrize('geometry, visible', [
- (QRect(5, 5, 4, 4), False),
- (QRect(10, 10, 1, 1), True),
+ (core.QRect(5, 5, 4, 4), False),
+ (core.QRect(10, 10, 1, 1), True),
])
def test_scrolled(self, geometry, visible, stubs):
- scrolled_frame = stubs.FakeWebFrame(QRect(0, 0, 100, 100),
- scroll=QPoint(10, 10))
+ scrolled_frame = stubs.FakeWebFrame(core.QRect(0, 0, 100, 100),
+ scroll=core.QPoint(10, 10))
elem = get_webelem(geometry, scrolled_frame)
assert elem._is_visible(scrolled_frame) == visible
@@ -534,7 +535,7 @@ class TestIsVisible:
({'visibility': 'hidden', 'display': 'inline'}, False),
])
def test_css_attributes(self, frame, style, visible):
- elem = get_webelem(QRect(0, 0, 10, 10), frame, style=style)
+ elem = get_webelem(core.QRect(0, 0, 10, 10), frame, style=style)
assert elem._is_visible(frame) == visible
@@ -580,14 +581,14 @@ class TestIsVisibleIframe:
Returns an Objects object with frame/iframe/elems attributes.
"""
- frame = stubs.FakeWebFrame(QRect(0, 0, 300, 300))
- iframe = stubs.FakeWebFrame(QRect(0, 10, 100, 100), parent=frame)
+ frame = stubs.FakeWebFrame(core.QRect(0, 0, 300, 300))
+ iframe = stubs.FakeWebFrame(core.QRect(0, 10, 100, 100), parent=frame)
assert frame.geometry().contains(iframe.geometry())
elems = [
- get_webelem(QRect(0, 0, 10, 10), iframe),
- get_webelem(QRect(20, 90, 10, 10), iframe),
- get_webelem(QRect(20, 150, 10, 10), iframe),
- get_webelem(QRect(30, 180, 10, 10), frame),
+ get_webelem(core.QRect(0, 0, 10, 10), iframe),
+ get_webelem(core.QRect(20, 90, 10, 10), iframe),
+ get_webelem(core.QRect(20, 150, 10, 10), iframe),
+ get_webelem(core.QRect(30, 180, 10, 10), frame),
]
assert elems[0]._is_visible(frame)
@@ -599,7 +600,7 @@ class TestIsVisibleIframe:
def test_iframe_scrolled(self, objects):
"""Scroll iframe down so elem3 gets visible and elem1/elem2 not."""
- objects.iframe.scrollPosition.return_value = QPoint(0, 100)
+ objects.iframe.scrollPosition.return_value = core.QPoint(0, 100)
assert not objects.elems[0]._is_visible(objects.frame)
assert not objects.elems[1]._is_visible(objects.frame)
assert objects.elems[2]._is_visible(objects.frame)
@@ -607,7 +608,7 @@ class TestIsVisibleIframe:
def test_mainframe_scrolled_iframe_visible(self, objects):
"""Scroll mainframe down so iframe is partly visible but elem1 not."""
- objects.frame.scrollPosition.return_value = QPoint(0, 50)
+ objects.frame.scrollPosition.return_value = core.QPoint(0, 50)
geom = objects.frame.geometry().translated(
objects.frame.scrollPosition())
assert not geom.contains(objects.iframe.geometry())
@@ -619,7 +620,7 @@ class TestIsVisibleIframe:
def test_mainframe_scrolled_iframe_invisible(self, objects):
"""Scroll mainframe down so iframe is invisible."""
- objects.frame.scrollPosition.return_value = QPoint(0, 110)
+ objects.frame.scrollPosition.return_value = core.QPoint(0, 110)
geom = objects.frame.geometry().translated(
objects.frame.scrollPosition())
assert not geom.contains(objects.iframe.geometry())
@@ -651,13 +652,13 @@ class TestIsVisibleIframe:
Returns an Objects object with frame/iframe/elems attributes.
"""
- frame = stubs.FakeWebFrame(QRect(0, 0, 300, 300))
- iframe = stubs.FakeWebFrame(QRect(0, 10, 100, 100), parent=frame)
+ frame = stubs.FakeWebFrame(core.QRect(0, 0, 300, 300))
+ iframe = stubs.FakeWebFrame(core.QRect(0, 10, 100, 100), parent=frame)
assert frame.geometry().contains(iframe.geometry())
elems = [
- get_webelem(QRect(10, 10, 0, 0), iframe),
- get_webelem(QRect(20, 150, 0, 0), iframe),
+ get_webelem(core.QRect(10, 10, 0, 0), iframe),
+ get_webelem(core.QRect(20, 150, 0, 0), iframe),
]
for e in elems:
assert not e.geometry().isValid()
@@ -689,18 +690,18 @@ class TestRectOnView:
{'length': '1', '0': {'width': 0, 'height': 0, 'x': 0, 'y': 0}},
])
def test_simple(self, stubs, js_rect):
- geometry = QRect(5, 5, 4, 4)
- frame = stubs.FakeWebFrame(QRect(0, 0, 100, 100))
+ geometry = core.QRect(5, 5, 4, 4)
+ frame = stubs.FakeWebFrame(core.QRect(0, 0, 100, 100))
elem = get_webelem(geometry, frame, js_rect_return=js_rect)
- assert elem.rect_on_view() == QRect(5, 5, 4, 4)
+ assert elem.rect_on_view() == core.QRect(5, 5, 4, 4)
@pytest.mark.parametrize('js_rect', [None, {}])
def test_scrolled(self, stubs, js_rect):
- geometry = QRect(20, 20, 4, 4)
- frame = stubs.FakeWebFrame(QRect(0, 0, 100, 100),
- scroll=QPoint(10, 10))
+ geometry = core.QRect(20, 20, 4, 4)
+ frame = stubs.FakeWebFrame(core.QRect(0, 0, 100, 100),
+ scroll=core.QPoint(10, 10))
elem = get_webelem(geometry, frame, js_rect_return=js_rect)
- assert elem.rect_on_view() == QRect(20 - 10, 20 - 10, 4, 4)
+ assert elem.rect_on_view() == core.QRect(20 - 10, 20 - 10, 4, 4)
@pytest.mark.parametrize('js_rect', [None, {}])
def test_iframe(self, stubs, js_rect):
@@ -719,19 +720,19 @@ class TestRectOnView:
##############################
200, 0 200, 200
"""
- frame = stubs.FakeWebFrame(QRect(0, 0, 200, 200))
- iframe = stubs.FakeWebFrame(QRect(0, 10, 100, 100), parent=frame)
+ frame = stubs.FakeWebFrame(core.QRect(0, 0, 200, 200))
+ iframe = stubs.FakeWebFrame(core.QRect(0, 10, 100, 100), parent=frame)
assert frame.geometry().contains(iframe.geometry())
- elem = get_webelem(QRect(20, 90, 10, 10), iframe,
+ elem = get_webelem(core.QRect(20, 90, 10, 10), iframe,
js_rect_return=js_rect)
- assert elem.rect_on_view() == QRect(20, 10 + 90, 10, 10)
+ assert elem.rect_on_view() == core.QRect(20, 10 + 90, 10, 10)
@pytest.mark.parametrize('js_rect', [None, {}])
def test_passed_geometry(self, stubs, js_rect):
"""Make sure geometry isn't called when a geometry is passed."""
- frame = stubs.FakeWebFrame(QRect(0, 0, 200, 200))
+ frame = stubs.FakeWebFrame(core.QRect(0, 0, 200, 200))
elem = get_webelem(frame=frame, js_rect_return=js_rect)
- rect = QRect(10, 20, 30, 40)
+ rect = core.QRect(10, 20, 30, 40)
assert elem.rect_on_view(elem_geometry=rect) == rect
assert not elem._elem.geometry.called
@@ -742,11 +743,11 @@ class TestRectOnView:
"""Make sure the coordinates are adjusted when zoomed."""
monkeypatch.setattr(objects, 'backend', usertypes.Backend.QtWebKit)
config_stub.val.zoom.text_only = zoom_text_only
- geometry = QRect(10, 10, 4, 4)
- frame = stubs.FakeWebFrame(QRect(0, 0, 100, 100), zoom=0.5)
+ geometry = core.QRect(10, 10, 4, 4)
+ frame = stubs.FakeWebFrame(core.QRect(0, 0, 100, 100), zoom=0.5)
elem = get_webelem(geometry, frame, js_rect_return=js_rect,
zoom_text_only=zoom_text_only)
- assert elem.rect_on_view() == QRect(10, 10, 4, 4)
+ assert elem.rect_on_view() == core.QRect(10, 10, 4, 4)
class TestGetChildFrames:
@@ -886,20 +887,20 @@ class TestIsEditable:
@pytest.mark.parametrize('attributes, expected', [
# No attributes
({}, None),
- ({'href': 'foo'}, QUrl('http://www.example.com/foo')),
- ({'src': 'foo'}, QUrl('http://www.example.com/foo')),
- ({'href': 'foo', 'src': 'bar'}, QUrl('http://www.example.com/foo')),
+ ({'href': 'foo'}, core.QUrl('http://www.example.com/foo')),
+ ({'src': 'foo'}, core.QUrl('http://www.example.com/foo')),
+ ({'href': 'foo', 'src': 'bar'}, core.QUrl('http://www.example.com/foo')),
({'href': '::garbage::'}, None),
- ({'href': 'http://www.example.org/'}, QUrl('http://www.example.org/')),
- ({'href': ' foo '}, QUrl('http://www.example.com/foo')),
+ ({'href': 'http://www.example.org/'}, core.QUrl('http://www.example.org/')),
+ ({'href': ' foo '}, core.QUrl('http://www.example.com/foo')),
])
def test_resolve_url(attributes, expected):
elem = get_webelem(attributes=attributes)
- baseurl = QUrl('http://www.example.com/')
+ baseurl = core.QUrl('http://www.example.com/')
assert elem.resolve_url(baseurl) == expected
def test_resolve_url_relative_base():
elem = get_webelem(attributes={'href': 'foo'})
with pytest.raises(ValueError):
- elem.resolve_url(QUrl('base'))
+ elem.resolve_url(core.QUrl('base'))
diff --git a/tests/unit/commands/test_argparser.py b/tests/unit/commands/test_argparser.py
index 2d95e4b4e..1aabfb2ab 100644
--- a/tests/unit/commands/test_argparser.py
+++ b/tests/unit/commands/test_argparser.py
@@ -23,7 +23,7 @@ import inspect
import enum
import pytest
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import core
from qutebrowser.commands import argparser, cmdexc
@@ -62,7 +62,7 @@ class TestArgumentParser:
with pytest.raises(argparser.ArgumentParserExit):
parser.parse_args(['--help'])
- expected_url = QUrl('qute://help/commands.html#foo')
+ expected_url = core.QUrl('qute://help/commands.html#foo')
assert tabbed_browser_stubs[1].loaded_url == expected_url
diff --git a/tests/unit/commands/test_userscripts.py b/tests/unit/commands/test_userscripts.py
index 9d8d65fd6..ccdcce31d 100644
--- a/tests/unit/commands/test_userscripts.py
+++ b/tests/unit/commands/test_userscripts.py
@@ -25,7 +25,7 @@ import logging
import signal
import pytest
-from qutebrowser.qt.core import QFileSystemWatcher
+from qutebrowser.qt import core
from qutebrowser.commands import userscripts
from qutebrowser.utils import utils
@@ -171,7 +171,7 @@ def test_command_with_error(qtbot, py_proc, runner, caplog):
def test_killed_command(qtbot, tmp_path, py_proc, runner, caplog):
data_file = tmp_path / 'data'
- watcher = QFileSystemWatcher()
+ watcher = core.QFileSystemWatcher()
watcher.addPath(str(tmp_path))
cmd, args = py_proc(r"""
diff --git a/tests/unit/completion/test_completer.py b/tests/unit/completion/test_completer.py
index 9218a1333..659332ac2 100644
--- a/tests/unit/completion/test_completer.py
+++ b/tests/unit/completion/test_completer.py
@@ -22,7 +22,7 @@
import unittest.mock
import pytest
-from qutebrowser.qt.gui import QStandardItemModel
+from qutebrowser.qt import gui
from qutebrowser.completion import completer, completionwidget
from qutebrowser.commands import command
@@ -36,7 +36,7 @@ def setup_cur_tab(tabbed_browser_stubs, fake_web_tab):
tabbed_browser_stubs[0].widget.current_index = 0
-class FakeCompletionModel(QStandardItemModel):
+class FakeCompletionModel(gui.QStandardItemModel):
"""Stub for a completion model."""
diff --git a/tests/unit/completion/test_completiondelegate.py b/tests/unit/completion/test_completiondelegate.py
index 31df6f1ce..3bdb4938e 100644
--- a/tests/unit/completion/test_completiondelegate.py
+++ b/tests/unit/completion/test_completiondelegate.py
@@ -21,9 +21,7 @@ from unittest import mock
import hypothesis
import hypothesis.strategies
import pytest
-from qutebrowser.qt.core import Qt
-from qutebrowser.qt.gui import QTextDocument, QColor
-from qutebrowser.qt.widgets import QTextEdit
+from qutebrowser.qt import widgets, gui, core
from qutebrowser.completion import completiondelegate
@@ -50,8 +48,8 @@ from qutebrowser.completion import completiondelegate
('an anomaly', 'an anomaly', [(0, 2), (3, 7)]),
])
def test_highlight(pat, txt, segments):
- doc = QTextDocument(txt)
- highlighter = completiondelegate._Highlighter(doc, pat, Qt.GlobalColor.red)
+ doc = gui.QTextDocument(txt)
+ highlighter = completiondelegate._Highlighter(doc, pat, core.Qt.GlobalColor.red)
highlighter.setFormat = mock.Mock()
highlighter.highlightBlock(txt)
highlighter.setFormat.assert_has_calls([
@@ -62,10 +60,10 @@ def test_highlight(pat, txt, segments):
def test_benchmark_highlight(benchmark):
txt = 'boofoobar'
pat = 'foo bar'
- doc = QTextDocument(txt)
+ doc = gui.QTextDocument(txt)
def bench():
- highlighter = completiondelegate._Highlighter(doc, pat, Qt.GlobalColor.red)
+ highlighter = completiondelegate._Highlighter(doc, pat, core.Qt.GlobalColor.red)
highlighter.highlightBlock(txt)
benchmark(bench)
@@ -74,8 +72,8 @@ def test_benchmark_highlight(benchmark):
@hypothesis.given(text=hypothesis.strategies.text())
def test_pattern_hypothesis(text):
"""Make sure we can't produce invalid patterns."""
- doc = QTextDocument()
- completiondelegate._Highlighter(doc, text, Qt.GlobalColor.red)
+ doc = gui.QTextDocument()
+ completiondelegate._Highlighter(doc, text, core.Qt.GlobalColor.red)
def test_highlighted(qtbot):
@@ -86,14 +84,14 @@ def test_highlighted(qtbot):
whether CompletionItemDelegate._get_textdoc() works properly, but testing
that is kind of hard, so we just test it in isolation here.
"""
- doc = QTextDocument()
- completiondelegate._Highlighter(doc, 'Hello', Qt.GlobalColor.red)
+ doc = gui.QTextDocument()
+ completiondelegate._Highlighter(doc, 'Hello', core.Qt.GlobalColor.red)
doc.setPlainText('Hello World')
# Needed so the highlighting actually works.
- edit = QTextEdit()
+ edit = widgets.QTextEdit()
qtbot.add_widget(edit)
edit.setDocument(doc)
colors = [f.foreground().color() for f in doc.allFormats()]
- assert QColor('red') in colors
+ assert gui.QColor('red') in colors
diff --git a/tests/unit/completion/test_completionmodel.py b/tests/unit/completion/test_completionmodel.py
index 95fadd57b..1092f097a 100644
--- a/tests/unit/completion/test_completionmodel.py
+++ b/tests/unit/completion/test_completionmodel.py
@@ -24,7 +24,7 @@ import hypothesis
from hypothesis import strategies
import pytest
-from qutebrowser.qt.core import QModelIndex
+from qutebrowser.qt import core
from qutebrowser.completion.models import completionmodel, listcategory
from qutebrowser.utils import qtutils
@@ -114,5 +114,5 @@ def test_delete_cur_item_no_cat():
model.rowsAboutToBeRemoved.connect(callback)
model.rowsRemoved.connect(callback)
with pytest.raises(qtutils.QtValueError):
- model.delete_cur_item(QModelIndex())
+ model.delete_cur_item(core.QModelIndex())
callback.assert_not_called()
diff --git a/tests/unit/completion/test_completionwidget.py b/tests/unit/completion/test_completionwidget.py
index 90d5a5efb..800efb93f 100644
--- a/tests/unit/completion/test_completionwidget.py
+++ b/tests/unit/completion/test_completionwidget.py
@@ -22,7 +22,7 @@
from unittest import mock
import pytest
-from qutebrowser.qt.core import QRect
+from qutebrowser.qt import core
from qutebrowser.completion import completionwidget
from qutebrowser.completion.models import completionmodel, listcategory
@@ -192,7 +192,7 @@ class TestCompletionItemFocusPage:
def patch_heights(self, monkeypatch, completionview):
"""Patch the item/widget heights so that 10 items are always visible."""
monkeypatch.setattr(completionview, 'visualRect',
- lambda _idx: QRect(0, 0, 100, 20))
+ lambda _idx: core.QRect(0, 0, 100, 20))
monkeypatch.setattr(completionview, 'height', lambda: 200)
@pytest.mark.parametrize('which, expected', [
diff --git a/tests/unit/completion/test_models.py b/tests/unit/completion/test_models.py
index fb44006aa..1a326c1df 100644
--- a/tests/unit/completion/test_models.py
+++ b/tests/unit/completion/test_models.py
@@ -31,11 +31,8 @@ from unittest import mock
import hypothesis
import hypothesis.strategies as hst
import pytest
-from qutebrowser.qt.core import QUrl, QDateTime, QProcess
try:
- from qutebrowser.qt.webenginecore import (
- QWebEngineHistory, QWebEngineHistoryItem
- )
+ pass
except ImportError:
pass
@@ -46,6 +43,7 @@ from qutebrowser.completion.models import (
from qutebrowser.config import configdata, configtypes
from qutebrowser.utils import usertypes
from qutebrowser.mainwindow import tabbedbrowser
+from qutebrowser.qt import webenginecore, core
def _check_completions(model, expected):
@@ -211,17 +209,17 @@ def local_files_path(tmp_path):
def web_history_populated(web_history):
"""Pre-populate the web-history database."""
web_history.add_url(
- url=QUrl('http://qutebrowser.org'),
+ url=core.QUrl('http://qutebrowser.org'),
title='qutebrowser',
atime=datetime(2015, 9, 5).timestamp()
)
web_history.add_url(
- url=QUrl('https://python.org'),
+ url=core.QUrl('https://python.org'),
title='Welcome to Python.org',
atime=datetime(2016, 3, 8).timestamp()
)
web_history.add_url(
- url=QUrl('https://github.com'),
+ url=core.QUrl('https://github.com'),
title='https://github.com',
atime=datetime(2016, 5, 1).timestamp()
)
@@ -711,7 +709,7 @@ def test_url_completion_pattern(web_history, quickmark_manager_stub,
bookmark_manager_stub, info,
url, title, pattern, rowcount):
"""Test that url completion filters by url and title."""
- web_history.add_url(QUrl(url), title)
+ web_history.add_url(core.QUrl(url), title)
model = urlmodel.url(info=info)
model.set_pattern(pattern)
# 2, 0 is History
@@ -816,12 +814,12 @@ def test_session_completion(qtmodeltester, session_manager_stub):
def test_tab_completion(qtmodeltester, fake_web_tab, win_registry,
tabbed_browser_stubs):
tabbed_browser_stubs[0].widget.tabs = [
- fake_web_tab(QUrl('https://github.com'), 'GitHub', 0),
- fake_web_tab(QUrl('https://wikipedia.org'), 'Wikipedia', 1),
- fake_web_tab(QUrl('https://duckduckgo.com'), 'DuckDuckGo', 2),
+ fake_web_tab(core.QUrl('https://github.com'), 'GitHub', 0),
+ fake_web_tab(core.QUrl('https://wikipedia.org'), 'Wikipedia', 1),
+ fake_web_tab(core.QUrl('https://duckduckgo.com'), 'DuckDuckGo', 2),
]
tabbed_browser_stubs[1].widget.tabs = [
- fake_web_tab(QUrl('https://wiki.archlinux.org'), 'ArchWiki', 0),
+ fake_web_tab(core.QUrl('https://wiki.archlinux.org'), 'ArchWiki', 0),
]
model = miscmodels.tabs()
model.set_pattern('')
@@ -843,12 +841,12 @@ def test_tab_completion_delete(qtmodeltester, fake_web_tab, win_registry,
tabbed_browser_stubs):
"""Verify closing a tab by deleting it from the completion widget."""
tabbed_browser_stubs[0].widget.tabs = [
- fake_web_tab(QUrl('https://github.com'), 'GitHub', 0),
- fake_web_tab(QUrl('https://wikipedia.org'), 'Wikipedia', 1),
- fake_web_tab(QUrl('https://duckduckgo.com'), 'DuckDuckGo', 2)
+ fake_web_tab(core.QUrl('https://github.com'), 'GitHub', 0),
+ fake_web_tab(core.QUrl('https://wikipedia.org'), 'Wikipedia', 1),
+ fake_web_tab(core.QUrl('https://duckduckgo.com'), 'DuckDuckGo', 2)
]
tabbed_browser_stubs[1].widget.tabs = [
- fake_web_tab(QUrl('https://wiki.archlinux.org'), 'ArchWiki', 0),
+ fake_web_tab(core.QUrl('https://wiki.archlinux.org'), 'ArchWiki', 0),
]
model = miscmodels.tabs()
model.set_pattern('')
@@ -863,20 +861,20 @@ def test_tab_completion_delete(qtmodeltester, fake_web_tab, win_registry,
model.delete_cur_item(idx)
actual = [tab.url() for tab in tabbed_browser_stubs[0].widget.tabs]
- assert actual == [QUrl('https://github.com'),
- QUrl('https://duckduckgo.com')]
+ assert actual == [core.QUrl('https://github.com'),
+ core.QUrl('https://duckduckgo.com')]
def test_tab_focus_completion_delete(qtmodeltester, fake_web_tab, win_registry,
tabbed_browser_stubs, info):
"""Verify closing a tab by deleting it from the completion widget."""
tabbed_browser_stubs[0].widget.tabs = [
- fake_web_tab(QUrl('https://github.com'), 'GitHub', 0),
- fake_web_tab(QUrl('https://wikipedia.org'), 'Wikipedia', 1),
- fake_web_tab(QUrl('https://duckduckgo.com'), 'DuckDuckGo', 2)
+ fake_web_tab(core.QUrl('https://github.com'), 'GitHub', 0),
+ fake_web_tab(core.QUrl('https://wikipedia.org'), 'Wikipedia', 1),
+ fake_web_tab(core.QUrl('https://duckduckgo.com'), 'DuckDuckGo', 2)
]
tabbed_browser_stubs[1].widget.tabs = [
- fake_web_tab(QUrl('https://wiki.archlinux.org'), 'ArchWiki', 0),
+ fake_web_tab(core.QUrl('https://wiki.archlinux.org'), 'ArchWiki', 0),
]
model = miscmodels.tab_focus(info=info)
model.set_pattern('')
@@ -891,8 +889,8 @@ def test_tab_focus_completion_delete(qtmodeltester, fake_web_tab, win_registry,
model.delete_cur_item(idx)
actual = [tab.url() for tab in tabbed_browser_stubs[0].widget.tabs]
- assert actual == [QUrl('https://github.com'),
- QUrl('https://duckduckgo.com')]
+ assert actual == [core.QUrl('https://github.com'),
+ core.QUrl('https://duckduckgo.com')]
def test_tab_completion_not_sorted(qtmodeltester, fake_web_tab, win_registry,
@@ -909,7 +907,7 @@ def test_tab_completion_not_sorted(qtmodeltester, fake_web_tab, win_registry,
expected.append(("0/{}".format(idx), url, title))
tabbed_browser_stubs[0].widget.tabs = [
- fake_web_tab(QUrl(tab[1]), tab[2], idx)
+ fake_web_tab(core.QUrl(tab[1]), tab[2], idx)
for idx, tab in enumerate(expected)
]
model = miscmodels.tabs()
@@ -927,12 +925,12 @@ def test_tab_completion_tabs_are_windows(qtmodeltester, fake_web_tab,
config_stub):
"""Verify tabs across all windows are listed under a single category."""
tabbed_browser_stubs[0].widget.tabs = [
- fake_web_tab(QUrl('https://github.com'), 'GitHub', 0),
- fake_web_tab(QUrl('https://wikipedia.org'), 'Wikipedia', 1),
- fake_web_tab(QUrl('https://duckduckgo.com'), 'DuckDuckGo', 2),
+ fake_web_tab(core.QUrl('https://github.com'), 'GitHub', 0),
+ fake_web_tab(core.QUrl('https://wikipedia.org'), 'Wikipedia', 1),
+ fake_web_tab(core.QUrl('https://duckduckgo.com'), 'DuckDuckGo', 2),
]
tabbed_browser_stubs[1].widget.tabs = [
- fake_web_tab(QUrl('https://wiki.archlinux.org'), 'ArchWiki', 0),
+ fake_web_tab(core.QUrl('https://wiki.archlinux.org'), 'ArchWiki', 0),
]
config_stub.val.tabs.tabs_are_windows = True
@@ -953,12 +951,12 @@ def test_tab_completion_tabs_are_windows(qtmodeltester, fake_web_tab,
def test_other_tabs_completion(qtmodeltester, fake_web_tab, win_registry,
tabbed_browser_stubs, info):
tabbed_browser_stubs[0].widget.tabs = [
- fake_web_tab(QUrl('https://github.com'), 'GitHub', 0),
- fake_web_tab(QUrl('https://wikipedia.org'), 'Wikipedia', 1),
- fake_web_tab(QUrl('https://duckduckgo.com'), 'DuckDuckGo', 2),
+ fake_web_tab(core.QUrl('https://github.com'), 'GitHub', 0),
+ fake_web_tab(core.QUrl('https://wikipedia.org'), 'Wikipedia', 1),
+ fake_web_tab(core.QUrl('https://duckduckgo.com'), 'DuckDuckGo', 2),
]
tabbed_browser_stubs[1].widget.tabs = [
- fake_web_tab(QUrl('https://wiki.archlinux.org'), 'ArchWiki', 0),
+ fake_web_tab(core.QUrl('https://wiki.archlinux.org'), 'ArchWiki', 0),
]
info.win_id = 1
model = miscmodels.other_tabs(info=info)
@@ -977,12 +975,12 @@ def test_other_tabs_completion(qtmodeltester, fake_web_tab, win_registry,
def test_other_tabs_completion_id0(qtmodeltester, fake_web_tab,
win_registry, tabbed_browser_stubs, info):
tabbed_browser_stubs[0].widget.tabs = [
- fake_web_tab(QUrl('https://github.com'), 'GitHub', 0),
- fake_web_tab(QUrl('https://wikipedia.org'), 'Wikipedia', 1),
- fake_web_tab(QUrl('https://duckduckgo.com'), 'DuckDuckGo', 2),
+ fake_web_tab(core.QUrl('https://github.com'), 'GitHub', 0),
+ fake_web_tab(core.QUrl('https://wikipedia.org'), 'Wikipedia', 1),
+ fake_web_tab(core.QUrl('https://duckduckgo.com'), 'DuckDuckGo', 2),
]
tabbed_browser_stubs[1].widget.tabs = [
- fake_web_tab(QUrl('https://wiki.archlinux.org'), 'ArchWiki', 0),
+ fake_web_tab(core.QUrl('https://wiki.archlinux.org'), 'ArchWiki', 0),
]
info.win_id = 0
model = miscmodels.other_tabs(info=info)
@@ -999,12 +997,12 @@ def test_other_tabs_completion_id0(qtmodeltester, fake_web_tab,
def test_tab_focus_completion(qtmodeltester, fake_web_tab, win_registry,
tabbed_browser_stubs, info):
tabbed_browser_stubs[0].widget.tabs = [
- fake_web_tab(QUrl('https://github.com'), 'GitHub', 0),
- fake_web_tab(QUrl('https://wikipedia.org'), 'Wikipedia', 1),
- fake_web_tab(QUrl('https://duckduckgo.com'), 'DuckDuckGo', 2),
+ fake_web_tab(core.QUrl('https://github.com'), 'GitHub', 0),
+ fake_web_tab(core.QUrl('https://wikipedia.org'), 'Wikipedia', 1),
+ fake_web_tab(core.QUrl('https://duckduckgo.com'), 'DuckDuckGo', 2),
]
tabbed_browser_stubs[1].widget.tabs = [
- fake_web_tab(QUrl('https://wiki.archlinux.org'), 'ArchWiki', 0),
+ fake_web_tab(core.QUrl('https://wiki.archlinux.org'), 'ArchWiki', 0),
]
info.win_id = 1
model = miscmodels.tab_focus(info=info)
@@ -1034,12 +1032,12 @@ def test_tab_focus_completion(qtmodeltester, fake_web_tab, win_registry,
def test_window_completion(qtmodeltester, fake_web_tab, tabbed_browser_stubs,
info):
tabbed_browser_stubs[0].widget.tabs = [
- fake_web_tab(QUrl('https://github.com'), 'GitHub', 0),
- fake_web_tab(QUrl('https://wikipedia.org'), 'Wikipedia', 1),
- fake_web_tab(QUrl('https://duckduckgo.com'), 'DuckDuckGo', 2)
+ fake_web_tab(core.QUrl('https://github.com'), 'GitHub', 0),
+ fake_web_tab(core.QUrl('https://wikipedia.org'), 'Wikipedia', 1),
+ fake_web_tab(core.QUrl('https://duckduckgo.com'), 'DuckDuckGo', 2)
]
tabbed_browser_stubs[1].widget.tabs = [
- fake_web_tab(QUrl('https://wiki.archlinux.org'), 'ArchWiki', 0)
+ fake_web_tab(core.QUrl('https://wiki.archlinux.org'), 'ArchWiki', 0)
]
info.win_id = 1
@@ -1349,7 +1347,7 @@ def test_url_completion_benchmark(benchmark, info,
def tab_with_history(fake_web_tab, tabbed_browser_stubs, info, monkeypatch):
"""Returns a fake tab with some fake history items."""
pytest.importorskip('qutebrowser.qt.webenginewidgets')
- tab = fake_web_tab(QUrl('https://github.com'), 'GitHub', 0)
+ tab = fake_web_tab(core.QUrl('https://github.com'), 'GitHub', 0)
current_idx = 2
monkeypatch.setattr(
tab.history, 'current_idx',
@@ -1365,13 +1363,13 @@ def tab_with_history(fake_web_tab, tabbed_browser_stubs, info, monkeypatch):
("http://example.com/thing3", "thing3 detail", now+15),
("http://example.com/thing4", "thing4 detail", now+20),
]:
- entry = mock.Mock(spec=QWebEngineHistoryItem)
- entry.url.return_value = QUrl(url)
+ entry = mock.Mock(spec=webenginecore.QWebEngineHistoryItem)
+ entry.url.return_value = core.QUrl(url)
entry.title.return_value = title
- dt = QDateTime.fromMSecsSinceEpoch(int(ts * 1000))
+ dt = core.QDateTime.fromMSecsSinceEpoch(int(ts * 1000))
entry.lastVisited.return_value = dt
history.append(entry)
- tab.history._history = mock.Mock(spec=QWebEngineHistory)
+ tab.history._history = mock.Mock(spec=webenginecore.QWebEngineHistory)
tab.history._history.items.return_value = history
monkeypatch.setattr(
tab.history, 'back_items',
@@ -1423,13 +1421,13 @@ def test_forward_completion(tab_with_history, info):
def test_undo_completion(tabbed_browser_stubs, info):
"""Test :undo completion."""
- entry1 = tabbedbrowser._UndoEntry(url=QUrl('https://example.org/'),
+ entry1 = tabbedbrowser._UndoEntry(url=core.QUrl('https://example.org/'),
history=None, index=None, pinned=None,
created_at=datetime(2020, 1, 1))
- entry2 = tabbedbrowser._UndoEntry(url=QUrl('https://example.com/'),
+ entry2 = tabbedbrowser._UndoEntry(url=core.QUrl('https://example.com/'),
history=None, index=None, pinned=None,
created_at=datetime(2020, 1, 2))
- entry3 = tabbedbrowser._UndoEntry(url=QUrl('https://example.net/'),
+ entry3 = tabbedbrowser._UndoEntry(url=core.QUrl('https://example.net/'),
history=None, index=None, pinned=None,
created_at=datetime(2020, 1, 2))
@@ -1463,7 +1461,7 @@ def undo_completion_retains_sort_order(tabbed_browser_stubs, info):
tabbed_browser_stubs[0].undo_stack = [
tabbedbrowser._UndoEntry(
- url=QUrl(f'https://example.org/{idx}'),
+ url=core.QUrl(f'https://example.org/{idx}'),
history=None, index=None, pinned=None,
created_at=created_dt,
)
@@ -1490,7 +1488,7 @@ def test_process_completion(monkeypatch, stubs, info):
p1.cmd = 'cmd1'
p1.args = []
p1.outcome.running = False
- p1.outcome.status = QProcess.ExitStatus.NormalExit
+ p1.outcome.status = core.QProcess.ExitStatus.NormalExit
p1.outcome.code = 0
p2.pid = 1002
@@ -1502,7 +1500,7 @@ def test_process_completion(monkeypatch, stubs, info):
p3.cmd = 'cmd3'
p3.args = []
p3.outcome.running = False
- p3.outcome.status = QProcess.ExitStatus.NormalExit
+ p3.outcome.status = core.QProcess.ExitStatus.NormalExit
p3.outcome.code = 1
monkeypatch.setattr(guiprocess, 'all_processes', {
diff --git a/tests/unit/components/test_blockutils.py b/tests/unit/components/test_blockutils.py
index 9d259a0b8..e528cbb63 100644
--- a/tests/unit/components/test_blockutils.py
+++ b/tests/unit/components/test_blockutils.py
@@ -21,7 +21,7 @@
import io
from typing import IO
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import core
import pytest
@@ -50,7 +50,7 @@ def pretend_blocklists(tmp_path):
bl_dst_path = bl_dst_dir / filename
bl_dst_path.write_text("\n".join(blocklist_lines), encoding="utf-8")
assert bl_dst_path.is_file()
- urls.append(QUrl.fromLocalFile(str(bl_dst_path)).toString())
+ urls.append(core.QUrl.fromLocalFile(str(bl_dst_path)).toString())
return urls, bl_dst_dir
@@ -69,7 +69,7 @@ def test_blocklist_dl(qtbot, pretend_blocklists):
num_lines += 1
assert num_lines >= 1
- list_qurls = [QUrl(blocklist) for blocklist in pretend_blocklists[0]]
+ list_qurls = [core.QUrl(blocklist) for blocklist in pretend_blocklists[0]]
dl = blockutils.BlocklistDownloads(list_qurls)
dl.single_download_finished.connect(on_single_download)
diff --git a/tests/unit/components/test_braveadblock.py b/tests/unit/components/test_braveadblock.py
index d776e94be..cafb2a7d7 100644
--- a/tests/unit/components/test_braveadblock.py
+++ b/tests/unit/components/test_braveadblock.py
@@ -22,7 +22,7 @@ import logging
import csv
from typing import Iterable, Tuple
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import core
import pytest
@@ -110,8 +110,8 @@ def run_function_on_dataset(given_function):
dataset = testutils.adblock_dataset_tsv()
reader = csv.DictReader(dataset, delimiter="\t")
for row in reader:
- url = QUrl(row["url"])
- source_url = QUrl(row["source_url"])
+ url = core.QUrl(row["url"])
+ source_url = core.QUrl(row["source_url"])
resource_type = ResourceType[row["type"]]
given_function(url, source_url, resource_type)
@@ -130,7 +130,7 @@ def assert_none_blocked(ad_blocker):
def blocklist_invalid_utf8(tmp_path):
dest_path = tmp_path / "invalid_utf8.txt"
dest_path.write_bytes(b"invalidutf8\xa0")
- return QUrl.fromLocalFile(str(dest_path)).toString()
+ return core.QUrl.fromLocalFile(str(dest_path)).toString()
@pytest.fixture
@@ -150,7 +150,7 @@ def easylist_easyprivacy_both(tmp_path):
bl_dst_path = bl_dst_dir / filename
bl_dst_path.write_text("\n".join(list(blocklist)), encoding="utf-8")
assert bl_dst_path.is_file()
- urls.append(QUrl.fromLocalFile(str(bl_dst_path)).toString())
+ urls.append(core.QUrl.fromLocalFile(str(bl_dst_path)).toString())
return urls, bl_dst_dir
@@ -184,8 +184,8 @@ def assert_urls(
should_be_blocked: bool,
) -> None:
for (str_url, source_str_url, request_type) in urls:
- url = QUrl(str_url)
- source_url = QUrl(source_str_url)
+ url = core.QUrl(str_url)
+ source_url = core.QUrl(source_str_url)
is_blocked = ad_blocker._is_blocked(url, source_url, request_type)
assert is_blocked == should_be_blocked
@@ -327,7 +327,7 @@ def test_whitelist_on_dataset(config_stub, easylist_easyprivacy):
assert not blockutils.is_whitelisted_url(url)
config_stub.val.content.blocking.whitelist = []
assert not blockutils.is_whitelisted_url(url)
- whitelist_url = url.toString(QUrl.UrlFormattingOption.RemovePath) + "/*"
+ whitelist_url = url.toString(core.QUrl.UrlFormattingOption.RemovePath) + "/*"
config_stub.val.content.blocking.whitelist = [whitelist_url]
assert blockutils.is_whitelisted_url(url)
@@ -342,7 +342,7 @@ def test_update_easylist_easyprivacy_directory(
lists_directory = easylist_easyprivacy_both[1]
config_stub.val.content.blocking.adblock.lists = [
- QUrl.fromLocalFile(str(lists_directory)).toString()
+ core.QUrl.fromLocalFile(str(lists_directory)).toString()
]
config_stub.val.content.blocking.enabled = True
config_stub.val.content.blocking.whitelist = None
@@ -359,7 +359,7 @@ def test_update_easylist_easyprivacy_directory(
def test_update_empty_directory_blocklist(ad_blocker, config_stub, empty_dir, caplog):
- tmpdir_url = QUrl.fromLocalFile(str(empty_dir)).toString()
+ tmpdir_url = core.QUrl.fromLocalFile(str(empty_dir)).toString()
config_stub.val.content.blocking.adblock.lists = [tmpdir_url]
config_stub.val.content.blocking.enabled = True
config_stub.val.content.blocking.whitelist = None
@@ -386,12 +386,12 @@ def test_buggy_url_workaround(ad_blocker, config_stub, easylist_easyprivacy,
config_stub.val.content.blocking.adblock.lists = easylist_easyprivacy
ad_blocker.adblock_update()
- url = QUrl(url_str)
+ url = core.QUrl(url_str)
assert url.isValid()
if source_url_str is None:
source_url = None
else:
- source_url = QUrl(source_url_str)
+ source_url = core.QUrl(source_url_str)
assert source_url.isValid()
assert not ad_blocker._is_blocked(url, source_url, resource_type)
diff --git a/tests/unit/components/test_hostblock.py b/tests/unit/components/test_hostblock.py
index 92791f71f..d28629fda 100644
--- a/tests/unit/components/test_hostblock.py
+++ b/tests/unit/components/test_hostblock.py
@@ -24,7 +24,7 @@ import logging
import pytest
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import core
from qutebrowser.components import hostblock
from qutebrowser.utils import urlmatch
@@ -130,7 +130,7 @@ def assert_urls(
"""
whitelisted = list(whitelisted) + ["localhost"]
for str_url in urls_to_check:
- url = QUrl(str_url)
+ url = core.QUrl(str_url)
host = url.host()
if host in blocked and host not in whitelisted:
assert host_blocker._is_blocked(url)
@@ -141,7 +141,7 @@ def assert_urls(
def blocklist_to_url(path):
"""Get an example.com-URL with the given filename as path."""
assert not path.is_absolute(), path
- url = QUrl("http://example.com/")
+ url = core.QUrl("http://example.com/")
url.setPath("/" + str(path))
assert url.isValid(), url.errorString()
return url
@@ -204,7 +204,7 @@ def generic_blocklists(directory):
blocklist3 = blocklist_to_url(create_zipfile(directory, [file1], "block3"))
# local text file with valid hosts
- blocklist4 = QUrl.fromLocalFile(
+ blocklist4 = core.QUrl.fromLocalFile(
str(
directory
/ create_blocklist(
@@ -268,7 +268,7 @@ def test_disabled_blocking_update(
current_download.finished.emit()
host_blocker.read_hosts()
for str_url in URLS_TO_CHECK:
- assert not host_blocker._is_blocked(QUrl(str_url))
+ assert not host_blocker._is_blocked(core.QUrl(str_url))
def test_disabled_blocking_per_url(config_stub, host_blocker_factory):
@@ -279,13 +279,13 @@ def test_disabled_blocking_per_url(config_stub, host_blocker_factory):
pattern = urlmatch.UrlPattern(example_com)
config_stub.set_obj("content.blocking.enabled", False, pattern=pattern)
- url = QUrl("https://blocked.example.com")
+ url = core.QUrl("https://blocked.example.com")
host_blocker = host_blocker_factory()
host_blocker._blocked_hosts.add(url.host())
assert host_blocker._is_blocked(url)
- assert not host_blocker._is_blocked(url, first_party_url=QUrl(example_com))
+ assert not host_blocker._is_blocked(url, first_party_url=core.QUrl(example_com))
def test_no_blocklist_update(config_stub, download_stub, host_blocker_factory):
@@ -300,7 +300,7 @@ def test_no_blocklist_update(config_stub, download_stub, host_blocker_factory):
for dl in download_stub.downloads:
dl.successful = True
for str_url in URLS_TO_CHECK:
- assert not host_blocker._is_blocked(QUrl(str_url))
+ assert not host_blocker._is_blocked(core.QUrl(str_url))
def test_successful_update(config_stub, tmp_path, caplog, host_blocker_factory):
@@ -499,7 +499,7 @@ def test_config_change_initial(config_stub, tmp_path, host_blocker_factory):
host_blocker = host_blocker_factory()
host_blocker.read_hosts()
for str_url in URLS_TO_CHECK:
- assert not host_blocker._is_blocked(QUrl(str_url))
+ assert not host_blocker._is_blocked(core.QUrl(str_url))
def test_config_change(config_stub, tmp_path, host_blocker_factory):
@@ -523,7 +523,7 @@ def test_config_change(config_stub, tmp_path, host_blocker_factory):
config_stub.val.content.blocking.hosts.lists = None
host_blocker.read_hosts()
for str_url in URLS_TO_CHECK:
- assert not host_blocker._is_blocked(QUrl(str_url))
+ assert not host_blocker._is_blocked(core.QUrl(str_url))
def test_add_directory(config_stub, tmp_path, host_blocker_factory):
@@ -557,7 +557,7 @@ def test_adblock_benchmark(data_tmpdir, benchmark, host_blocker_factory):
blocked_hosts = data_tmpdir / "blocked-hosts"
blocked_hosts.write_text("\n".join(testutils.blocked_hosts()), encoding="utf-8")
- url = QUrl("https://www.example.org/")
+ url = core.QUrl("https://www.example.org/")
blocker = host_blocker_factory()
blocker.read_hosts()
assert blocker._blocked_hosts
@@ -572,6 +572,6 @@ def test_subdomain_blocking(config_stub, host_blocker_factory, block_subdomains)
config_stub.val.content.blocking.hosts.block_subdomains = block_subdomains
host_blocker = host_blocker_factory()
host_blocker._blocked_hosts.add("example.com")
- is_blocked = host_blocker._is_blocked(QUrl("https://subdomain.example.com"))
+ is_blocked = host_blocker._is_blocked(core.QUrl("https://subdomain.example.com"))
# block_subdomains is also expected result of is_blocked
assert is_blocked == block_subdomains
diff --git a/tests/unit/components/test_readlinecommands.py b/tests/unit/components/test_readlinecommands.py
index d10867a54..2ca5e4146 100644
--- a/tests/unit/components/test_readlinecommands.py
+++ b/tests/unit/components/test_readlinecommands.py
@@ -20,11 +20,10 @@
import os
import re
import inspect
-
-from qutebrowser.qt.widgets import QLineEdit, QApplication
import pytest
from qutebrowser.components import readlinecommands
+from qutebrowser.qt import widgets
# Some functions aren't 100% readline compatible:
@@ -35,7 +34,7 @@ from qutebrowser.components import readlinecommands
fixme = pytest.mark.xfail(reason='readline compatibility - see #678')
-class LineEdit(QLineEdit):
+class LineEdit(widgets.QLineEdit):
"""QLineEdit with some methods to make testing easier."""
@@ -120,13 +119,13 @@ def lineedit(qtbot, monkeypatch):
"""Fixture providing a LineEdit."""
le = LineEdit()
qtbot.add_widget(le)
- monkeypatch.setattr(QApplication.instance(), 'focusWidget', lambda: le)
+ monkeypatch.setattr(widgets.QApplication.instance(), 'focusWidget', lambda: le)
return le
def test_none(qtbot):
"""Call each rl_* method with a None focusWidget."""
- assert QApplication.instance().focusWidget() is None
+ assert widgets.QApplication.instance().focusWidget() is None
for name, method in inspect.getmembers(readlinecommands,
inspect.isfunction):
if name == "rl_rubout":
diff --git a/tests/unit/config/test_config.py b/tests/unit/config/test_config.py
index 24d724a9d..45ae1d547 100644
--- a/tests/unit/config/test_config.py
+++ b/tests/unit/config/test_config.py
@@ -23,8 +23,7 @@ import unittest.mock
import functools
import pytest
-from qutebrowser.qt.core import QUrl
-from qutebrowser.qt.gui import QColor
+from qutebrowser.qt import gui, core
from qutebrowser.config import config, configdata, configexc
from qutebrowser.utils import usertypes, urlmatch
@@ -494,14 +493,14 @@ class TestConfig:
def test_get(self, conf):
"""Test conf.get() with a QColor (where get/get_obj is different)."""
- assert conf.get('colors.completion.category.fg') == QColor('white')
+ assert conf.get('colors.completion.category.fg') == gui.QColor('white')
def test_get_for_url(self, conf):
"""Test conf.get() with a URL/pattern."""
pattern = urlmatch.UrlPattern('*://example.com/')
name = 'content.javascript.enabled'
conf.set_obj(name, False, pattern=pattern)
- assert conf.get(name, url=QUrl('https://example.com/')) is False
+ assert conf.get(name, url=core.QUrl('https://example.com/')) is False
@pytest.mark.parametrize('fallback, expected', [
(True, True),
@@ -510,7 +509,7 @@ class TestConfig:
def test_get_for_url_fallback(self, conf, fallback, expected):
"""Test conf.get() with a URL and fallback."""
value = conf.get('content.javascript.enabled',
- url=QUrl('https://example.com/'),
+ url=core.QUrl('https://example.com/'),
fallback=fallback)
assert value is expected
@@ -766,7 +765,7 @@ class TestContainer:
@pytest.mark.parametrize('configapi, expected', [
(object(), 'rgb'),
- (None, QColor.Spec.Rgb),
+ (None, gui.QColor.Spec.Rgb),
])
def test_getattr_option(self, container, configapi, expected):
container._configapi = configapi
diff --git a/tests/unit/config/test_configcommands.py b/tests/unit/config/test_configcommands.py
index e80ab99ee..729db7de1 100644
--- a/tests/unit/config/test_configcommands.py
+++ b/tests/unit/config/test_configcommands.py
@@ -23,7 +23,7 @@ import functools
import unittest.mock
import pytest
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import core
from qutebrowser.config import configcommands
from qutebrowser.api import cmdutils
@@ -59,7 +59,7 @@ class TestSet:
Should open qute://settings."""
commands.set(win_id=0)
- assert tabbed_browser_stubs[0].loaded_url == QUrl('qute://settings')
+ assert tabbed_browser_stubs[0].loaded_url == core.QUrl('qute://settings')
@pytest.mark.parametrize('option', ['url.auto_search?', 'url.auto_search'])
def test_get(self, config_stub, commands, message_mock, option):
@@ -222,7 +222,7 @@ def test_diff(commands, tabbed_browser_stubs, include_hidden, url):
Should open qute://configdiff.
"""
commands.config_diff(win_id=0, include_hidden=include_hidden)
- assert tabbed_browser_stubs[0].loaded_url == QUrl(url)
+ assert tabbed_browser_stubs[0].loaded_url == core.QUrl(url)
class TestCycle:
@@ -473,7 +473,7 @@ class TestUnsetAndClear:
def test_unset_pattern(self, commands, config_stub, set_global):
name = 'content.javascript.enabled'
pattern = urlmatch.UrlPattern('*://example.com')
- url = QUrl('https://example.com')
+ url = core.QUrl('https://example.com')
if set_global:
config_stub.set_obj(name, False)
@@ -731,8 +731,8 @@ class TestBind:
return {'normal': {}}
@pytest.mark.parametrize("mode, url", [
- ("normal", QUrl("qute://bindings")),
- ("passthrough", QUrl("qute://bindings#passthrough")),
+ ("normal", core.QUrl("qute://bindings")),
+ ("passthrough", core.QUrl("qute://bindings#passthrough")),
])
def test_bind_no_args(self, commands, config_stub, no_bindings,
tabbed_browser_stubs, mode, url):
diff --git a/tests/unit/config/test_configfiles.py b/tests/unit/config/test_configfiles.py
index 9a56a1b1f..c44614d90 100644
--- a/tests/unit/config/test_configfiles.py
+++ b/tests/unit/config/test_configfiles.py
@@ -25,7 +25,7 @@ import textwrap
import logging
import pytest
-from qutebrowser.qt.core import QSettings
+from qutebrowser.qt import core
from qutebrowser.config import (config, configfiles, configexc, configdata,
configtypes)
@@ -187,7 +187,7 @@ def state_writer(data_tmpdir):
@pytest.fixture
def qtwe_version_patcher(monkeypatch):
try:
- from qutebrowser.qt import webenginecore # pylint: disable=unused-import
+ pass
except ImportError:
pytest.skip("QtWebEngine not available")
@@ -1579,7 +1579,7 @@ def test_init(init_patch, config_tmpdir):
# Make sure qsettings land in a subdir
if utils.is_linux:
- settings = QSettings()
+ settings = core.QSettings()
settings.setValue("hello", "world")
settings.sync()
assert (config_tmpdir / 'qsettings').exists()
diff --git a/tests/unit/config/test_configtypes.py b/tests/unit/config/test_configtypes.py
index e5d66eeaa..1d9b1b392 100644
--- a/tests/unit/config/test_configtypes.py
+++ b/tests/unit/config/test_configtypes.py
@@ -29,9 +29,7 @@ import dataclasses
import pytest
import hypothesis
from hypothesis import strategies
-from qutebrowser.qt.core import QUrl
-from qutebrowser.qt.gui import QColor, QFont
-from qutebrowser.qt.network import QNetworkProxy
+from qutebrowser.qt import network, gui, core
from qutebrowser.misc import objects
from qutebrowser.config import configtypes, configexc
@@ -41,12 +39,12 @@ from qutebrowser.keyinput import keyutils
from helpers import testutils
-class Font(QFont):
+class Font(gui.QFont):
"""A QFont with a nicer repr()."""
def __repr__(self):
- weight = debug.qenum_key(QFont, self.weight(), klass=QFont.Weight)
+ weight = debug.qenum_key(gui.QFont, self.weight(), klass=gui.QFont.Weight)
return utils.get_repr(
self,
family=self.family(),
@@ -1270,20 +1268,20 @@ class TestQtColor:
return configtypes.QtColor
@pytest.mark.parametrize('val, expected', [
- ('#123', QColor('#123')),
- ('#112233', QColor('#112233')),
- ('#44112233', QColor('#44112233')),
- ('#111222333', QColor('#111222333')),
- ('#111122223333', QColor('#111122223333')),
- ('red', QColor('red')),
+ ('#123', gui.QColor('#123')),
+ ('#112233', gui.QColor('#112233')),
+ ('#44112233', gui.QColor('#44112233')),
+ ('#111222333', gui.QColor('#111222333')),
+ ('#111122223333', gui.QColor('#111122223333')),
+ ('red', gui.QColor('red')),
- ('rgb(0, 0, 0)', QColor.fromRgb(0, 0, 0)),
- ('rgb(0,0,0)', QColor.fromRgb(0, 0, 0)),
+ ('rgb(0, 0, 0)', gui.QColor.fromRgb(0, 0, 0)),
+ ('rgb(0,0,0)', gui.QColor.fromRgb(0, 0, 0)),
- ('rgba(255, 255, 255, 1.0)', QColor.fromRgb(255, 255, 255, 255)),
+ ('rgba(255, 255, 255, 1.0)', gui.QColor.fromRgb(255, 255, 255, 255)),
- ('hsv(10%,10%,10%)', QColor.fromHsv(35, 25, 25)),
- ('hsva(10%,20%,30%,40%)', QColor.fromHsv(35, 51, 76, 102)),
+ ('hsv(10%,10%,10%)', gui.QColor.fromHsv(35, 25, 25)),
+ ('hsva(10%,20%,30%,40%)', gui.QColor.fromHsv(35, 51, 76, 102)),
])
def test_valid(self, klass, val, expected):
assert klass().to_py(val) == expected
@@ -1359,8 +1357,8 @@ class TestQssColor:
@dataclasses.dataclass
class FontDesc:
- style: QFont.Style
- weight: QFont.Weight
+ style: gui.QFont.Style
+ weight: gui.QFont.Weight
pt: int
px: int
family: str
@@ -1371,46 +1369,46 @@ class TestFont:
TESTS = {
# (style, weight, pointsize, pixelsize, family
'"Foobar Neue"':
- FontDesc(QFont.Style.StyleNormal, QFont.Weight.Normal, -1, -1, 'Foobar Neue'),
+ FontDesc(gui.QFont.Style.StyleNormal, gui.QFont.Weight.Normal, -1, -1, 'Foobar Neue'),
'inconsolatazi4':
- FontDesc(QFont.Style.StyleNormal, QFont.Weight.Normal, -1, -1,
+ FontDesc(gui.QFont.Style.StyleNormal, gui.QFont.Weight.Normal, -1, -1,
'inconsolatazi4'),
'Terminus (TTF)':
- FontDesc(QFont.Style.StyleNormal, QFont.Weight.Normal, -1, -1,
+ FontDesc(gui.QFont.Style.StyleNormal, gui.QFont.Weight.Normal, -1, -1,
'Terminus (TTF)'),
'10pt "Foobar Neue"':
- FontDesc(QFont.Style.StyleNormal, QFont.Weight.Normal, 10, None, 'Foobar Neue'),
+ FontDesc(gui.QFont.Style.StyleNormal, gui.QFont.Weight.Normal, 10, None, 'Foobar Neue'),
'10PT "Foobar Neue"':
- FontDesc(QFont.Style.StyleNormal, QFont.Weight.Normal, 10, None, 'Foobar Neue'),
+ FontDesc(gui.QFont.Style.StyleNormal, gui.QFont.Weight.Normal, 10, None, 'Foobar Neue'),
'10px "Foobar Neue"':
- FontDesc(QFont.Style.StyleNormal, QFont.Weight.Normal, None, 10, 'Foobar Neue'),
+ FontDesc(gui.QFont.Style.StyleNormal, gui.QFont.Weight.Normal, None, 10, 'Foobar Neue'),
'10PX "Foobar Neue"':
- FontDesc(QFont.Style.StyleNormal, QFont.Weight.Normal, None, 10, 'Foobar Neue'),
+ FontDesc(gui.QFont.Style.StyleNormal, gui.QFont.Weight.Normal, None, 10, 'Foobar Neue'),
'bold "Foobar Neue"':
- FontDesc(QFont.Style.StyleNormal, QFont.Weight.Bold, -1, -1, 'Foobar Neue'),
+ FontDesc(gui.QFont.Style.StyleNormal, gui.QFont.Weight.Bold, -1, -1, 'Foobar Neue'),
'italic "Foobar Neue"':
- FontDesc(QFont.Style.StyleItalic, QFont.Weight.Normal, -1, -1, 'Foobar Neue'),
+ FontDesc(gui.QFont.Style.StyleItalic, gui.QFont.Weight.Normal, -1, -1, 'Foobar Neue'),
'oblique "Foobar Neue"':
- FontDesc(QFont.Style.StyleOblique, QFont.Weight.Normal, -1, -1, 'Foobar Neue'),
+ FontDesc(gui.QFont.Style.StyleOblique, gui.QFont.Weight.Normal, -1, -1, 'Foobar Neue'),
'normal bold "Foobar Neue"':
- FontDesc(QFont.Style.StyleNormal, QFont.Weight.Bold, -1, -1, 'Foobar Neue'),
+ FontDesc(gui.QFont.Style.StyleNormal, gui.QFont.Weight.Bold, -1, -1, 'Foobar Neue'),
'bold italic "Foobar Neue"':
- FontDesc(QFont.Style.StyleItalic, QFont.Weight.Bold, -1, -1, 'Foobar Neue'),
+ FontDesc(gui.QFont.Style.StyleItalic, gui.QFont.Weight.Bold, -1, -1, 'Foobar Neue'),
'bold 10pt "Foobar Neue"':
- FontDesc(QFont.Style.StyleNormal, QFont.Weight.Bold, 10, None, 'Foobar Neue'),
+ FontDesc(gui.QFont.Style.StyleNormal, gui.QFont.Weight.Bold, 10, None, 'Foobar Neue'),
'italic 10pt "Foobar Neue"':
- FontDesc(QFont.Style.StyleItalic, QFont.Weight.Normal, 10, None, 'Foobar Neue'),
+ FontDesc(gui.QFont.Style.StyleItalic, gui.QFont.Weight.Normal, 10, None, 'Foobar Neue'),
'oblique 10pt "Foobar Neue"':
- FontDesc(QFont.Style.StyleOblique, QFont.Weight.Normal, 10, None,
+ FontDesc(gui.QFont.Style.StyleOblique, gui.QFont.Weight.Normal, 10, None,
'Foobar Neue'),
'normal bold 10pt "Foobar Neue"':
- FontDesc(QFont.Style.StyleNormal, QFont.Weight.Bold, 10, None, 'Foobar Neue'),
+ FontDesc(gui.QFont.Style.StyleNormal, gui.QFont.Weight.Bold, 10, None, 'Foobar Neue'),
'bold italic 10pt "Foobar Neue"':
- FontDesc(QFont.Style.StyleItalic, QFont.Weight.Bold, 10, None, 'Foobar Neue'),
+ FontDesc(gui.QFont.Style.StyleItalic, gui.QFont.Weight.Bold, 10, None, 'Foobar Neue'),
'normal 300 10pt "Foobar Neue"':
- FontDesc(QFont.Style.StyleNormal, 37, 10, None, 'Foobar Neue'),
+ FontDesc(gui.QFont.Style.StyleNormal, 37, 10, None, 'Foobar Neue'),
'normal 800 10pt "Foobar Neue"':
- FontDesc(QFont.Style.StyleNormal, 99, 10, None, 'Foobar Neue'),
+ FontDesc(gui.QFont.Style.StyleNormal, 99, 10, None, 'Foobar Neue'),
}
font_xfail = pytest.mark.xfail(reason='FIXME: #103')
@@ -1887,21 +1885,21 @@ class TestProxy:
@pytest.mark.parametrize('val, expected', [
('system', configtypes.SYSTEM_PROXY),
- ('none', QNetworkProxy(QNetworkProxy.ProxyType.NoProxy)),
+ ('none', network.QNetworkProxy(network.QNetworkProxy.ProxyType.NoProxy)),
('socks://example.com/',
- QNetworkProxy(QNetworkProxy.ProxyType.Socks5Proxy, 'example.com')),
+ network.QNetworkProxy(network.QNetworkProxy.ProxyType.Socks5Proxy, 'example.com')),
('socks5://foo:bar@example.com:2323',
- QNetworkProxy(QNetworkProxy.ProxyType.Socks5Proxy, 'example.com', 2323,
+ network.QNetworkProxy(network.QNetworkProxy.ProxyType.Socks5Proxy, 'example.com', 2323,
'foo', 'bar')),
('pac+http://example.com/proxy.pac',
- pac.PACFetcher(QUrl('pac+http://example.com/proxy.pac'))),
+ pac.PACFetcher(core.QUrl('pac+http://example.com/proxy.pac'))),
('pac+file:///tmp/proxy.pac',
- pac.PACFetcher(QUrl('pac+file:///tmp/proxy.pac'))),
+ pac.PACFetcher(core.QUrl('pac+file:///tmp/proxy.pac'))),
])
def test_to_py_valid(self, klass, val, expected):
actual = klass().to_py(val)
- if isinstance(actual, QNetworkProxy):
- actual = QNetworkProxy(actual)
+ if isinstance(actual, network.QNetworkProxy):
+ actual = network.QNetworkProxy(actual)
assert actual == expected
@pytest.mark.parametrize('val', [
@@ -1954,8 +1952,8 @@ class TestFuzzyUrl:
return configtypes.FuzzyUrl
@pytest.mark.parametrize('val, expected', [
- ('http://example.com/?q={}', QUrl('http://example.com/?q={}')),
- ('example.com', QUrl('http://example.com')),
+ ('http://example.com/?q={}', core.QUrl('http://example.com/?q={}')),
+ ('example.com', core.QUrl('http://example.com')),
])
def test_to_py_valid(self, klass, val, expected):
assert klass().to_py(val) == expected
@@ -2010,8 +2008,8 @@ class TestEncoding:
class TestUrl:
TESTS = {
- 'http://qutebrowser.org/': QUrl('http://qutebrowser.org/'),
- 'http://heise.de/': QUrl('http://heise.de/'),
+ 'http://qutebrowser.org/': core.QUrl('http://qutebrowser.org/'),
+ 'http://heise.de/': core.QUrl('http://heise.de/'),
}
@pytest.fixture
diff --git a/tests/unit/config/test_configutils.py b/tests/unit/config/test_configutils.py
index 15f031bd4..bfbe13ff4 100644
--- a/tests/unit/config/test_configutils.py
+++ b/tests/unit/config/test_configutils.py
@@ -20,8 +20,7 @@
import hypothesis
from hypothesis import strategies
import pytest
-from qutebrowser.qt.core import QUrl
-from qutebrowser.qt.widgets import QLabel
+from qutebrowser.qt import widgets, core
from qutebrowser.config import configutils, configdata, configtypes, configexc
from qutebrowser.utils import urlmatch, usertypes, qtutils
@@ -112,8 +111,8 @@ def test_add_existing(values):
def test_add_new(values, other_pattern):
values.add('example.org value', other_pattern)
assert values.get_for_url() == 'global value'
- example_com = QUrl('https://www.example.com/')
- example_org = QUrl('https://www.example.org/')
+ example_com = core.QUrl('https://www.example.com/')
+ example_org = core.QUrl('https://www.example.org/')
assert values.get_for_url(example_com) == 'example value'
assert values.get_for_url(example_org) == 'example.org value'
@@ -122,7 +121,7 @@ def test_remove_existing(values, pattern):
removed = values.remove(pattern)
assert removed
- url = QUrl('https://www.example.com/')
+ url = core.QUrl('https://www.example.com/')
assert values.get_for_url(url) == 'global value'
@@ -130,7 +129,7 @@ def test_remove_non_existing(values, other_pattern):
removed = values.remove(other_pattern)
assert not removed
- url = QUrl('https://www.example.com/')
+ url = core.QUrl('https://www.example.com/')
assert values.get_for_url(url) == 'example value'
@@ -142,13 +141,13 @@ def test_clear(values):
def test_get_matching(values):
- url = QUrl('https://www.example.com/')
+ url = core.QUrl('https://www.example.com/')
assert values.get_for_url(url, fallback=False) == 'example value'
def test_get_invalid(values):
with pytest.raises(qtutils.QtValueError):
- values.get_for_url(QUrl())
+ values.get_for_url(core.QUrl())
def test_get_unset(empty_values):
@@ -165,12 +164,12 @@ def test_get_unset_fallback(empty_values):
def test_get_non_matching(values):
- url = QUrl('https://www.example.ch/')
+ url = core.QUrl('https://www.example.ch/')
assert values.get_for_url(url, fallback=False) is usertypes.UNSET
def test_get_non_matching_fallback(values):
- url = QUrl('https://www.example.ch/')
+ url = core.QUrl('https://www.example.ch/')
assert values.get_for_url(url) == 'global value'
@@ -178,7 +177,7 @@ def test_get_multiple_matches(values):
"""With multiple matching pattern, the last added should win."""
all_pattern = urlmatch.UrlPattern('*://*/')
values.add('new value', all_pattern)
- url = QUrl('https://www.example.com/')
+ url = core.QUrl('https://www.example.com/')
assert values.get_for_url(url) == 'new value'
@@ -188,7 +187,7 @@ def test_get_non_domain_patterns(empty_values):
empty_values.add('fallback')
empty_values.add('value', pat1)
- assert empty_values.get_for_url(QUrl("http://qutebrowser.org")) == 'value'
+ assert empty_values.get_for_url(core.QUrl("http://qutebrowser.org")) == 'value'
assert empty_values.get_for_url() == 'fallback'
@@ -245,9 +244,9 @@ def test_get_trailing_dot(values):
other_pattern = urlmatch.UrlPattern('https://www.example.org./')
values.add('example.org value', other_pattern)
assert values.get_for_url() == 'global value'
- example_com = QUrl('https://www.example.com/')
- example_org = QUrl('https://www.example.org./')
- example_org_2 = QUrl('https://www.example.org/')
+ example_com = core.QUrl('https://www.example.com/')
+ example_org = core.QUrl('https://www.example.org./')
+ example_org_2 = core.QUrl('https://www.example.org/')
assert values.get_for_url(example_com) == 'example value'
assert (values.get_for_url(example_org) ==
values.get_for_url(example_org_2) ==
@@ -262,7 +261,7 @@ def test_get_trailing_dot(values):
values.remove(pattern),
id='remove'),
pytest.param(lambda values, pattern:
- values.get_for_url(QUrl('https://example.org/')),
+ values.get_for_url(core.QUrl('https://example.org/')),
id='get_for_url'),
pytest.param(lambda values, pattern:
values.get_for_pattern(pattern),
@@ -292,7 +291,7 @@ def test_add_url_benchmark(values, benchmark):
'http://bop.foo.bar.baz/',
])
def test_domain_lookup_sparse_benchmark(url, values, benchmark):
- url = QUrl(url)
+ url = core.QUrl(url)
values.add(False, urlmatch.UrlPattern("*.foo.bar.baz"))
for line in testutils.blocked_hosts():
values.add(False, urlmatch.UrlPattern(line))
@@ -349,7 +348,7 @@ class TestFontFamilies:
def test_system_default_rendering(self, qtbot):
families = configutils.FontFamilies.from_system_default()
- label = QLabel()
+ label = widgets.QLabel()
qtbot.add_widget(label)
label.setText("Hello World")
@@ -371,7 +370,7 @@ class TestFontFamilies:
# Try to find out whether the monospace font did a fallback on a non-monospace
# font...
- fallback_label = QLabel() # pylint: disable=unreachable
+ fallback_label = widgets.QLabel() # pylint: disable=unreachable
qtbot.add_widget(label)
fallback_label.setText("fallback")
diff --git a/tests/unit/config/test_qtargs_locale_workaround.py b/tests/unit/config/test_qtargs_locale_workaround.py
index c70ab0b63..b6833c42a 100644
--- a/tests/unit/config/test_qtargs_locale_workaround.py
+++ b/tests/unit/config/test_qtargs_locale_workaround.py
@@ -20,7 +20,7 @@ import os
import pathlib
import pytest
-from qutebrowser.qt.core import QLocale
+from qutebrowser.qt import core
from qutebrowser.utils import utils
from qutebrowser.config import qtargs
@@ -406,7 +406,7 @@ def qtwe_version():
])
@pytest.mark.linux
def test_lang_workaround_all_locales(lang, expected, qtwe_version):
- locale_name = QLocale(lang).bcp47Name()
+ locale_name = core.QLocale(lang).bcp47Name()
print(locale_name)
override = qtargs._get_lang_override(
diff --git a/tests/unit/config/test_stylesheet.py b/tests/unit/config/test_stylesheet.py
index 2a9e5fc6d..bfdd76ccb 100644
--- a/tests/unit/config/test_stylesheet.py
+++ b/tests/unit/config/test_stylesheet.py
@@ -18,12 +18,12 @@
import pytest
-from qutebrowser.qt.core import QObject
+from qutebrowser.qt import core
from qutebrowser.config import stylesheet
-class StyleObj(QObject):
+class StyleObj(core.QObject):
def __init__(self, stylesheet=None, parent=None):
super().__init__(parent)
diff --git a/tests/unit/javascript/conftest.py b/tests/unit/javascript/conftest.py
index 97ff994e4..51dfd5059 100644
--- a/tests/unit/javascript/conftest.py
+++ b/tests/unit/javascript/conftest.py
@@ -23,7 +23,7 @@ import pathlib
import pytest
import jinja2
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import core
import qutebrowser
from qutebrowser.utils import usertypes
@@ -54,7 +54,7 @@ class JSTester:
'warning': 'error'
}
- def load(self, path, base_url=QUrl(), **kwargs):
+ def load(self, path, base_url=core.QUrl(), **kwargs):
"""Load and display the given jinja test data.
Args:
@@ -86,10 +86,10 @@ class JSTester:
path: The string path from disk to load (relative to this file)
force: Whether to force loading even if the file is invalid.
"""
- self.load_url(QUrl.fromLocalFile(
+ self.load_url(core.QUrl.fromLocalFile(
str(JS_DIR / path)), force)
- def load_url(self, url: QUrl, force: bool = False):
+ def load_url(self, url: core.QUrl, force: bool = False):
"""Load a given QUrl.
Args:
diff --git a/tests/unit/javascript/test_greasemonkey.py b/tests/unit/javascript/test_greasemonkey.py
index 770023c18..ba587285e 100644
--- a/tests/unit/javascript/test_greasemonkey.py
+++ b/tests/unit/javascript/test_greasemonkey.py
@@ -23,7 +23,7 @@ import logging
import pathlib
import pytest
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import core
from qutebrowser.utils import usertypes, version
from qutebrowser.browser import greasemonkey
@@ -207,7 +207,7 @@ def test_get_scripts_by_url(gm_manager, url, expected_matches):
_save_script(test_gm_script, 'test.user.js')
gm_manager.load_scripts()
- scripts = gm_manager.scripts_for(QUrl(url))
+ scripts = gm_manager.scripts_for(core.QUrl(url))
assert len(scripts.start + scripts.end + scripts.idle) == expected_matches
@@ -231,7 +231,7 @@ def test_regex_includes_scripts_for(gm_manager, url, expected_matches):
_save_script(gh_dark_example, 'test.user.js')
gm_manager.load_scripts()
- scripts = gm_manager.scripts_for(QUrl(url))
+ scripts = gm_manager.scripts_for(core.QUrl(url))
assert len(scripts.start + scripts.end + scripts.idle) == expected_matches
@@ -242,7 +242,7 @@ def test_no_metadata(gm_manager, caplog):
with caplog.at_level(logging.WARNING):
gm_manager.load_scripts()
- scripts = gm_manager.scripts_for(QUrl('http://notamatch.invalid/'))
+ scripts = gm_manager.scripts_for(core.QUrl('http://notamatch.invalid/'))
assert len(scripts.start + scripts.end + scripts.idle) == 1
assert len(scripts.end) == 1
@@ -283,7 +283,7 @@ def test_bad_scheme(gm_manager, caplog):
with caplog.at_level(logging.WARNING):
gm_manager.load_scripts()
- scripts = gm_manager.scripts_for(QUrl('qute://settings'))
+ scripts = gm_manager.scripts_for(core.QUrl('qute://settings'))
assert len(scripts.start + scripts.end + scripts.idle) == 0
diff --git a/tests/unit/javascript/test_js_execution.py b/tests/unit/javascript/test_js_execution.py
index 8a21d415a..e4d0f8327 100644
--- a/tests/unit/javascript/test_js_execution.py
+++ b/tests/unit/javascript/test_js_execution.py
@@ -24,15 +24,13 @@
import pytest
+from qutebrowser.qt import webkit, webenginecore
@pytest.mark.parametrize('js_enabled, expected', [(True, 2.0), (False, None)])
def test_simple_js_webkit(webview, js_enabled, expected):
"""With QtWebKit, evaluateJavaScript works when JS is on."""
- # If we get there (because of the webview fixture) we can be certain
- # QtWebKit is available
- from qutebrowser.qt.webkit import QWebSettings
- webview.settings().setAttribute(QWebSettings.WebAttribute.JavascriptEnabled, js_enabled)
+ webview.settings().setAttribute(webkit.QWebSettings.WebAttribute.JavascriptEnabled, js_enabled)
result = webview.page().mainFrame().evaluateJavaScript('1 + 1')
assert result == expected
@@ -40,10 +38,7 @@ def test_simple_js_webkit(webview, js_enabled, expected):
@pytest.mark.parametrize('js_enabled, expected', [(True, 2.0), (False, 2.0)])
def test_element_js_webkit(webview, js_enabled, expected):
"""With QtWebKit, evaluateJavaScript on an element works with JS off."""
- # If we get there (because of the webview fixture) we can be certain
- # QtWebKit is available
- from qutebrowser.qt.webkit import QWebSettings
- webview.settings().setAttribute(QWebSettings.WebAttribute.JavascriptEnabled, js_enabled)
+ webview.settings().setAttribute(webkit.QWebSettings.WebAttribute.JavascriptEnabled, js_enabled)
elem = webview.page().mainFrame().documentElement()
result = elem.evaluateJavaScript('1 + 1')
assert result == expected
@@ -64,16 +59,13 @@ def test_element_js_webkit(webview, js_enabled, expected):
def test_simple_js_webengine(qtbot, webengineview, qapp,
js_enabled, world, expected):
"""With QtWebEngine, runJavaScript works even when JS is off."""
- # If we get there (because of the webengineview fixture) we can be certain
- # QtWebEngine is available
- from qutebrowser.qt.webenginecore import QWebEngineSettings, QWebEngineScript
- assert world in [QWebEngineScript.ScriptWorldId.MainWorld,
- QWebEngineScript.ScriptWorldId.ApplicationWorld,
- QWebEngineScript.ScriptWorldId.UserWorld]
+ assert world in [webenginecore.QWebEngineScript.ScriptWorldId.MainWorld,
+ webenginecore.QWebEngineScript.ScriptWorldId.ApplicationWorld,
+ webenginecore.QWebEngineScript.ScriptWorldId.UserWorld]
settings = webengineview.settings()
- settings.setAttribute(QWebEngineSettings.WebAttribute.JavascriptEnabled, js_enabled)
+ settings.setAttribute(webenginecore.QWebEngineSettings.WebAttribute.JavascriptEnabled, js_enabled)
qapp.processEvents()
page = webengineview.page()
diff --git a/tests/unit/javascript/test_js_quirks.py b/tests/unit/javascript/test_js_quirks.py
index 52b9a090f..9d21f5aff 100644
--- a/tests/unit/javascript/test_js_quirks.py
+++ b/tests/unit/javascript/test_js_quirks.py
@@ -26,37 +26,37 @@ the native functionality exists.
import pytest
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import core
from qutebrowser.utils import usertypes
@pytest.mark.parametrize('base_url, source, expected', [
pytest.param(
- QUrl(),
+ core.QUrl(),
'"This is a test".replaceAll("test", "fest")',
"This is a fest",
id='replace-all',
),
pytest.param(
- QUrl(),
+ core.QUrl(),
'"This is a test".replaceAll(/[tr]est/g, "fest")',
"This is a fest",
id='replace-all-regex',
),
pytest.param(
- QUrl(),
+ core.QUrl(),
'"This is a [test[".replaceAll("[", "<")',
"This is a <test<",
id='replace-all-reserved-string',
),
pytest.param(
- QUrl('https://test.qutebrowser.org/test'),
+ core.QUrl('https://test.qutebrowser.org/test'),
'typeof globalThis.setTimeout === "function"',
True,
id='global-this',
),
pytest.param(
- QUrl(),
+ core.QUrl(),
'Object.fromEntries([["0", "a"], ["1", "b"]])',
{'0': 'a', '1': 'b'},
id='object-fromentries',
diff --git a/tests/unit/keyinput/key_data.py b/tests/unit/keyinput/key_data.py
index b0819c699..9f9a72af9 100644
--- a/tests/unit/keyinput/key_data.py
+++ b/tests/unit/keyinput/key_data.py
@@ -25,7 +25,7 @@
import dataclasses
from typing import Optional
-from qutebrowser.qt.core import Qt
+from qutebrowser.qt import core
@dataclasses.dataclass(order=True)
@@ -50,7 +50,7 @@ class Key:
def __post_init__(self):
if self.attribute:
- self.member = getattr(Qt.Key, 'Key_' + self.attribute, None)
+ self.member = getattr(core.Qt.Key, 'Key_' + self.attribute, None)
if self.name is None:
self.name = self.attribute
@@ -72,7 +72,7 @@ class Modifier:
member: Optional[int] = None
def __post_init__(self):
- self.member = getattr(Qt.KeyboardModifier, self.attribute + 'Modifier')
+ self.member = getattr(core.Qt.KeyboardModifier, self.attribute + 'Modifier')
if self.name is None:
self.name = self.attribute
diff --git a/tests/unit/keyinput/test_basekeyparser.py b/tests/unit/keyinput/test_basekeyparser.py
index c2592c197..ecff4d343 100644
--- a/tests/unit/keyinput/test_basekeyparser.py
+++ b/tests/unit/keyinput/test_basekeyparser.py
@@ -21,7 +21,7 @@
from unittest import mock
-from qutebrowser.qt.core import Qt
+from qutebrowser.qt import core
import pytest
from qutebrowser.keyinput import basekeyparser, keyutils
@@ -54,7 +54,7 @@ def handle_text():
"""Helper function to handle multiple fake keypresses."""
def func(kp, *args):
for key in args:
- info = keyutils.KeyInfo(key, Qt.KeyboardModifier.NoModifier)
+ info = keyutils.KeyInfo(key, core.Qt.KeyboardModifier.NoModifier)
kp.handle(info.to_event())
return func
@@ -119,11 +119,11 @@ def test_read_config(keyparser, key_config_stub, changed_mode, expected):
class TestHandle:
def test_valid_key(self, prompt_keyparser, handle_text):
- modifier = Qt.KeyboardModifier.MetaModifier if utils.is_mac else Qt.KeyboardModifier.ControlModifier
+ modifier = core.Qt.KeyboardModifier.MetaModifier if utils.is_mac else core.Qt.KeyboardModifier.ControlModifier
infos = [
- keyutils.KeyInfo(Qt.Key.Key_A, modifier),
- keyutils.KeyInfo(Qt.Key.Key_X, modifier),
+ keyutils.KeyInfo(core.Qt.Key.Key_A, modifier),
+ keyutils.KeyInfo(core.Qt.Key.Key_X, modifier),
]
for info in infos:
prompt_keyparser.handle(info.to_event())
@@ -133,11 +133,11 @@ class TestHandle:
assert not prompt_keyparser._sequence
def test_valid_key_count(self, prompt_keyparser):
- modifier = Qt.KeyboardModifier.MetaModifier if utils.is_mac else Qt.KeyboardModifier.ControlModifier
+ modifier = core.Qt.KeyboardModifier.MetaModifier if utils.is_mac else core.Qt.KeyboardModifier.ControlModifier
infos = [
- keyutils.KeyInfo(Qt.Key.Key_5, Qt.KeyboardModifier.NoModifier),
- keyutils.KeyInfo(Qt.Key.Key_A, modifier),
+ keyutils.KeyInfo(core.Qt.Key.Key_5, core.Qt.KeyboardModifier.NoModifier),
+ keyutils.KeyInfo(core.Qt.Key.Key_A, modifier),
]
for info in infos:
prompt_keyparser.handle(info.to_event())
@@ -145,10 +145,10 @@ class TestHandle:
'message-info ctrla', 5)
@pytest.mark.parametrize('keys', [
- [(Qt.Key.Key_B, Qt.KeyboardModifier.NoModifier), (Qt.Key.Key_C, Qt.KeyboardModifier.NoModifier)],
- [(Qt.Key.Key_A, Qt.KeyboardModifier.ControlModifier | Qt.KeyboardModifier.AltModifier)],
+ [(core.Qt.Key.Key_B, core.Qt.KeyboardModifier.NoModifier), (core.Qt.Key.Key_C, core.Qt.KeyboardModifier.NoModifier)],
+ [(core.Qt.Key.Key_A, core.Qt.KeyboardModifier.ControlModifier | core.Qt.KeyboardModifier.AltModifier)],
# Only modifier
- [(Qt.Key.Key_Shift, Qt.KeyboardModifier.ShiftModifier)],
+ [(core.Qt.Key.Key_Shift, core.Qt.KeyboardModifier.ShiftModifier)],
])
def test_invalid_keys(self, prompt_keyparser, keys):
for key, modifiers in keys:
@@ -158,40 +158,40 @@ class TestHandle:
assert not prompt_keyparser._sequence
def test_dry_run(self, prompt_keyparser):
- b_info = keyutils.KeyInfo(Qt.Key.Key_B, Qt.KeyboardModifier.NoModifier)
+ b_info = keyutils.KeyInfo(core.Qt.Key.Key_B, core.Qt.KeyboardModifier.NoModifier)
prompt_keyparser.handle(b_info.to_event())
- a_info = keyutils.KeyInfo(Qt.Key.Key_A, Qt.KeyboardModifier.NoModifier)
+ a_info = keyutils.KeyInfo(core.Qt.Key.Key_A, core.Qt.KeyboardModifier.NoModifier)
prompt_keyparser.handle(a_info.to_event(), dry_run=True)
assert not prompt_keyparser.execute.called
assert prompt_keyparser._sequence
def test_dry_run_count(self, prompt_keyparser):
- info = keyutils.KeyInfo(Qt.Key.Key_9, Qt.KeyboardModifier.NoModifier)
+ info = keyutils.KeyInfo(core.Qt.Key.Key_9, core.Qt.KeyboardModifier.NoModifier)
prompt_keyparser.handle(info.to_event(), dry_run=True)
assert not prompt_keyparser._count
def test_invalid_key(self, prompt_keyparser):
- keys = [Qt.Key.Key_B, 0x0]
+ keys = [core.Qt.Key.Key_B, 0x0]
for key in keys:
- info = keyutils.KeyInfo(key, Qt.KeyboardModifier.NoModifier)
+ info = keyutils.KeyInfo(key, core.Qt.KeyboardModifier.NoModifier)
prompt_keyparser.handle(info.to_event())
assert not prompt_keyparser._sequence
def test_valid_keychain(self, handle_text, prompt_keyparser):
handle_text(prompt_keyparser,
# Press 'x' which is ignored because of no match
- Qt.Key.Key_X,
+ core.Qt.Key.Key_X,
# Then start the real chain
- Qt.Key.Key_B, Qt.Key.Key_A)
+ core.Qt.Key.Key_B, core.Qt.Key.Key_A)
prompt_keyparser.execute.assert_called_with('message-info ba', None)
assert not prompt_keyparser._sequence
@pytest.mark.parametrize('key, modifiers, number', [
- (Qt.Key.Key_0, Qt.KeyboardModifier.NoModifier, 0),
- (Qt.Key.Key_1, Qt.KeyboardModifier.NoModifier, 1),
- (Qt.Key.Key_1, Qt.KeyboardModifier.KeypadModifier, 1),
+ (core.Qt.Key.Key_0, core.Qt.KeyboardModifier.NoModifier, 0),
+ (core.Qt.Key.Key_1, core.Qt.KeyboardModifier.NoModifier, 1),
+ (core.Qt.Key.Key_1, core.Qt.KeyboardModifier.KeypadModifier, 1),
])
def test_number_press(self, prompt_keyparser,
key, modifiers, number):
@@ -201,8 +201,8 @@ class TestHandle:
assert not prompt_keyparser._sequence
@pytest.mark.parametrize('modifiers, text', [
- (Qt.KeyboardModifier.NoModifier, '2'),
- (Qt.KeyboardModifier.KeypadModifier, 'num-2'),
+ (core.Qt.KeyboardModifier.NoModifier, '2'),
+ (core.Qt.KeyboardModifier.KeypadModifier, 'num-2'),
])
def test_number_press_keypad(self, keyparser, config_stub,
modifiers, text):
@@ -210,18 +210,18 @@ class TestHandle:
config_stub.val.bindings.commands = {'normal': {
'2': 'message-info 2',
'<Num+2>': 'message-info num-2'}}
- keyparser.handle(keyutils.KeyInfo(Qt.Key.Key_2, modifiers).to_event())
+ keyparser.handle(keyutils.KeyInfo(core.Qt.Key.Key_2, modifiers).to_event())
command = 'message-info {}'.format(text)
keyparser.execute.assert_called_once_with(command, None)
assert not keyparser._sequence
def test_umlauts(self, handle_text, keyparser, config_stub):
config_stub.val.bindings.commands = {'normal': {'ü': 'message-info ü'}}
- handle_text(keyparser, Qt.Key.Key_Udiaeresis)
+ handle_text(keyparser, core.Qt.Key.Key_Udiaeresis)
keyparser.execute.assert_called_once_with('message-info ü', None)
def test_mapping(self, config_stub, handle_text, prompt_keyparser):
- handle_text(prompt_keyparser, Qt.Key.Key_X)
+ handle_text(prompt_keyparser, core.Qt.Key.Key_X)
prompt_keyparser.execute.assert_called_once_with(
'message-info a', None)
@@ -230,27 +230,27 @@ class TestHandle:
config_stub.val.bindings.commands = {'normal': {'a': 'nop'}}
config_stub.val.bindings.key_mappings = {'1': 'a'}
- info = keyutils.KeyInfo(Qt.Key.Key_1, Qt.KeyboardModifier.KeypadModifier)
+ info = keyutils.KeyInfo(core.Qt.Key.Key_1, core.Qt.KeyboardModifier.KeypadModifier)
keyparser.handle(info.to_event())
keyparser.execute.assert_called_once_with('nop', None)
def test_binding_and_mapping(self, config_stub, handle_text, prompt_keyparser):
"""with a conflicting binding/mapping, the binding should win."""
- handle_text(prompt_keyparser, Qt.Key.Key_B)
+ handle_text(prompt_keyparser, core.Qt.Key.Key_B)
assert not prompt_keyparser.execute.called
def test_mapping_in_key_chain(self, config_stub, handle_text, keyparser):
"""A mapping should work even as part of a keychain."""
config_stub.val.bindings.commands = {'normal':
{'aa': 'message-info aa'}}
- handle_text(keyparser, Qt.Key.Key_A, Qt.Key.Key_X)
+ handle_text(keyparser, core.Qt.Key.Key_A, core.Qt.Key.Key_X)
keyparser.execute.assert_called_once_with('message-info aa', None)
def test_binding_with_shift(self, prompt_keyparser):
"""Simulate a binding which involves shift."""
- for key, modifiers in [(Qt.Key.Key_Y, Qt.KeyboardModifier.NoModifier),
- (Qt.Key.Key_Shift, Qt.KeyboardModifier.ShiftModifier),
- (Qt.Key.Key_Y, Qt.KeyboardModifier.ShiftModifier)]:
+ for key, modifiers in [(core.Qt.Key.Key_Y, core.Qt.KeyboardModifier.NoModifier),
+ (core.Qt.Key.Key_Shift, core.Qt.KeyboardModifier.ShiftModifier),
+ (core.Qt.Key.Key_Y, core.Qt.KeyboardModifier.ShiftModifier)]:
info = keyutils.KeyInfo(key, modifiers)
prompt_keyparser.handle(info.to_event())
@@ -264,7 +264,7 @@ class TestHandle:
'a': 'message-info foo'
}
}
- info = keyutils.KeyInfo(Qt.Key.Key_A, Qt.KeyboardModifier.NoModifier)
+ info = keyutils.KeyInfo(core.Qt.Key.Key_A, core.Qt.KeyboardModifier.NoModifier)
keyparser.handle(info.to_event())
keyparser.execute.assert_called_once_with('message-info foo', None)
@@ -275,39 +275,39 @@ class TestCount:
def test_no_count(self, handle_text, prompt_keyparser):
"""Test with no count added."""
- handle_text(prompt_keyparser, Qt.Key.Key_B, Qt.Key.Key_A)
+ handle_text(prompt_keyparser, core.Qt.Key.Key_B, core.Qt.Key.Key_A)
prompt_keyparser.execute.assert_called_once_with(
'message-info ba', None)
assert not prompt_keyparser._sequence
def test_count_0(self, handle_text, prompt_keyparser):
- handle_text(prompt_keyparser, Qt.Key.Key_0, Qt.Key.Key_B, Qt.Key.Key_A)
+ handle_text(prompt_keyparser, core.Qt.Key.Key_0, core.Qt.Key.Key_B, core.Qt.Key.Key_A)
calls = [mock.call('message-info 0', None),
mock.call('message-info ba', None)]
prompt_keyparser.execute.assert_has_calls(calls)
assert not prompt_keyparser._sequence
def test_count_42(self, handle_text, prompt_keyparser):
- handle_text(prompt_keyparser, Qt.Key.Key_4, Qt.Key.Key_2, Qt.Key.Key_B, Qt.Key.Key_A)
+ handle_text(prompt_keyparser, core.Qt.Key.Key_4, core.Qt.Key.Key_2, core.Qt.Key.Key_B, core.Qt.Key.Key_A)
prompt_keyparser.execute.assert_called_once_with('message-info ba', 42)
assert not prompt_keyparser._sequence
def test_count_42_invalid(self, handle_text, prompt_keyparser):
# Invalid call with ccx gets ignored
handle_text(prompt_keyparser,
- Qt.Key.Key_4, Qt.Key.Key_2, Qt.Key.Key_C, Qt.Key.Key_C, Qt.Key.Key_X)
+ core.Qt.Key.Key_4, core.Qt.Key.Key_2, core.Qt.Key.Key_C, core.Qt.Key.Key_C, core.Qt.Key.Key_X)
assert not prompt_keyparser.execute.called
assert not prompt_keyparser._sequence
# Valid call with ccc gets the correct count
handle_text(prompt_keyparser,
- Qt.Key.Key_2, Qt.Key.Key_3, Qt.Key.Key_C, Qt.Key.Key_C, Qt.Key.Key_C)
+ core.Qt.Key.Key_2, core.Qt.Key.Key_3, core.Qt.Key.Key_C, core.Qt.Key.Key_C, core.Qt.Key.Key_C)
prompt_keyparser.execute.assert_called_once_with(
'message-info ccc', 23)
assert not prompt_keyparser._sequence
def test_superscript(self, handle_text, prompt_keyparser):
# https://github.com/qutebrowser/qutebrowser/issues/3743
- handle_text(prompt_keyparser, Qt.Key.Key_twosuperior, Qt.Key.Key_B, Qt.Key.Key_A)
+ handle_text(prompt_keyparser, core.Qt.Key.Key_twosuperior, core.Qt.Key.Key_B, core.Qt.Key.Key_A)
def test_count_keystring_update(self, qtbot,
handle_text, prompt_keyparser):
@@ -315,17 +315,17 @@ class TestCount:
with qtbot.wait_signals([
prompt_keyparser.keystring_updated,
prompt_keyparser.keystring_updated]) as blocker:
- handle_text(prompt_keyparser, Qt.Key.Key_4, Qt.Key.Key_2)
+ handle_text(prompt_keyparser, core.Qt.Key.Key_4, core.Qt.Key.Key_2)
sig1, sig2 = blocker.all_signals_and_args
assert sig1.args == ('4',)
assert sig2.args == ('42',)
def test_numpad(self, prompt_keyparser):
"""Make sure we can enter a count via numpad."""
- for key, modifiers in [(Qt.Key.Key_4, Qt.KeyboardModifier.KeypadModifier),
- (Qt.Key.Key_2, Qt.KeyboardModifier.KeypadModifier),
- (Qt.Key.Key_B, Qt.KeyboardModifier.NoModifier),
- (Qt.Key.Key_A, Qt.KeyboardModifier.NoModifier)]:
+ for key, modifiers in [(core.Qt.Key.Key_4, core.Qt.KeyboardModifier.KeypadModifier),
+ (core.Qt.Key.Key_2, core.Qt.KeyboardModifier.KeypadModifier),
+ (core.Qt.Key.Key_B, core.Qt.KeyboardModifier.NoModifier),
+ (core.Qt.Key.Key_A, core.Qt.KeyboardModifier.NoModifier)]:
info = keyutils.KeyInfo(key, modifiers)
prompt_keyparser.handle(info.to_event())
prompt_keyparser.execute.assert_called_once_with('message-info ba', 42)
@@ -352,7 +352,7 @@ def test_respect_config_when_matching_counts(keyparser, config_stub):
"""Don't match counts if disabled in the config."""
config_stub.val.input.match_counts = False
- info = keyutils.KeyInfo(Qt.Key.Key_1, Qt.KeyboardModifier.NoModifier)
+ info = keyutils.KeyInfo(core.Qt.Key.Key_1, core.Qt.KeyboardModifier.NoModifier)
keyparser.handle(info.to_event())
assert not keyparser._sequence
diff --git a/tests/unit/keyinput/test_bindingtrie.py b/tests/unit/keyinput/test_bindingtrie.py
index b0844c980..1da1af79a 100644
--- a/tests/unit/keyinput/test_bindingtrie.py
+++ b/tests/unit/keyinput/test_bindingtrie.py
@@ -25,7 +25,7 @@ import textwrap
import pytest
-from qutebrowser.qt.gui import QKeySequence
+from qutebrowser.qt import gui
from qutebrowser.keyinput import basekeyparser
from qutebrowser.keyinput import keyutils
@@ -39,7 +39,7 @@ def test_matches_single(entered, configured, match_type):
configured = keyutils.KeySequence.parse(configured)
trie = basekeyparser.BindingTrie()
trie[configured] = "eeloo"
- command = "eeloo" if match_type == QKeySequence.SequenceMatch.ExactMatch else None
+ command = "eeloo" if match_type == gui.QKeySequence.SequenceMatch.ExactMatch else None
result = basekeyparser.MatchResult(match_type=match_type,
command=command,
sequence=entered)
@@ -82,22 +82,22 @@ def test_str():
@pytest.mark.parametrize('configured, expected', [
([],
# null match
- [('a', QKeySequence.SequenceMatch.NoMatch),
- ('', QKeySequence.SequenceMatch.NoMatch)]),
+ [('a', gui.QKeySequence.SequenceMatch.NoMatch),
+ ('', gui.QKeySequence.SequenceMatch.NoMatch)]),
(['abcd'],
- [('abcd', QKeySequence.SequenceMatch.ExactMatch),
- ('abc', QKeySequence.SequenceMatch.PartialMatch)]),
+ [('abcd', gui.QKeySequence.SequenceMatch.ExactMatch),
+ ('abc', gui.QKeySequence.SequenceMatch.PartialMatch)]),
(['aa', 'ab', 'ac', 'ad'],
- [('ac', QKeySequence.SequenceMatch.ExactMatch),
- ('a', QKeySequence.SequenceMatch.PartialMatch),
- ('f', QKeySequence.SequenceMatch.NoMatch),
- ('acd', QKeySequence.SequenceMatch.NoMatch)]),
+ [('ac', gui.QKeySequence.SequenceMatch.ExactMatch),
+ ('a', gui.QKeySequence.SequenceMatch.PartialMatch),
+ ('f', gui.QKeySequence.SequenceMatch.NoMatch),
+ ('acd', gui.QKeySequence.SequenceMatch.NoMatch)]),
(['aaaaaaab', 'aaaaaaac', 'aaaaaaad'],
- [('aaaaaaab', QKeySequence.SequenceMatch.ExactMatch),
- ('z', QKeySequence.SequenceMatch.NoMatch)]),
+ [('aaaaaaab', gui.QKeySequence.SequenceMatch.ExactMatch),
+ ('z', gui.QKeySequence.SequenceMatch.NoMatch)]),
(string.ascii_letters,
- [('a', QKeySequence.SequenceMatch.ExactMatch),
- ('!', QKeySequence.SequenceMatch.NoMatch)]),
+ [('a', gui.QKeySequence.SequenceMatch.ExactMatch),
+ ('!', gui.QKeySequence.SequenceMatch.NoMatch)]),
])
def test_matches_tree(configured, expected, benchmark):
trie = basekeyparser.BindingTrie()
@@ -107,7 +107,7 @@ def test_matches_tree(configured, expected, benchmark):
def run():
for entered, match_type in expected:
sequence = keyutils.KeySequence.parse(entered)
- command = ("eeloo" if match_type == QKeySequence.SequenceMatch.ExactMatch
+ command = ("eeloo" if match_type == gui.QKeySequence.SequenceMatch.ExactMatch
else None)
result = basekeyparser.MatchResult(match_type=match_type,
command=command,
diff --git a/tests/unit/keyinput/test_keyutils.py b/tests/unit/keyinput/test_keyutils.py
index 8e7c3e276..748c87299 100644
--- a/tests/unit/keyinput/test_keyutils.py
+++ b/tests/unit/keyinput/test_keyutils.py
@@ -22,10 +22,7 @@ import operator
import hypothesis
from hypothesis import strategies
import pytest
-from qutebrowser.qt import machinery
-from qutebrowser.qt.core import Qt, QEvent, pyqtSignal
-from qutebrowser.qt.gui import QKeyEvent, QKeySequence
-from qutebrowser.qt.widgets import QWidget
+from qutebrowser.qt import widgets, gui, core, machinery
from helpers import testutils
from unit.keyinput import key_data
@@ -63,7 +60,7 @@ def qtest_key(request):
def test_key_data_keys():
"""Make sure all possible keys are in key_data.KEYS."""
key_names = {name[len("Key_"):]
- for name in testutils.enum_members(Qt, Qt.Key)}
+ for name in testutils.enum_members(core.Qt, core.Qt.Key)}
key_data_names = {key.attribute for key in sorted(key_data.KEYS)}
diff = key_names - key_data_names
assert not diff
@@ -72,14 +69,14 @@ def test_key_data_keys():
def test_key_data_modifiers():
"""Make sure all possible modifiers are in key_data.MODIFIERS."""
mod_names = {name[:-len("Modifier")]
- for name, value in testutils.enum_members(Qt, Qt.KeyboardModifier).items()
- if value not in [Qt.KeyboardModifier.NoModifier, Qt.KeyboardModifier.KeyboardModifierMask]}
+ for name, value in testutils.enum_members(core.Qt, core.Qt.KeyboardModifier).items()
+ if value not in [core.Qt.KeyboardModifier.NoModifier, core.Qt.KeyboardModifier.KeyboardModifierMask]}
mod_data_names = {mod.attribute for mod in sorted(key_data.MODIFIERS)}
diff = mod_names - mod_data_names
assert not diff
-class KeyTesterWidget(QWidget):
+class KeyTesterWidget(widgets.QWidget):
"""Widget to get the text of QKeyPressEvents.
@@ -87,7 +84,7 @@ class KeyTesterWidget(QWidget):
call that directly, only via QTest::keyPress.
"""
- got_text = pyqtSignal()
+ got_text = core.pyqtSignal()
def __init__(self, parent=None):
super().__init__(parent)
@@ -106,7 +103,7 @@ class TestKeyInfoText:
See key_data.py for inputs and expected values.
"""
- modifiers = Qt.KeyboardModifier.ShiftModifier if upper else Qt.KeyboardModifier.NoModifier
+ modifiers = core.Qt.KeyboardModifier.ShiftModifier if upper else core.Qt.KeyboardModifier.NoModifier
info = keyutils.KeyInfo(qt_key.member, modifiers=modifiers)
expected = qt_key.uppertext if upper else qt_key.text
assert info.text() == expected
@@ -143,38 +140,38 @@ class TestKeyToString:
monkeypatch.delattr(keyutils.Qt, 'Key_AltGr')
# We don't want to test the key which is actually missing - we only
# want to know if the mapping still behaves properly.
- assert keyutils._key_to_string(Qt.Key.Key_A) == 'A'
+ assert keyutils._key_to_string(core.Qt.Key.Key_A) == 'A'
@pytest.mark.parametrize('key, modifiers, expected', [
- (Qt.Key.Key_A, Qt.KeyboardModifier.NoModifier, 'a'),
- (Qt.Key.Key_A, Qt.KeyboardModifier.ShiftModifier, 'A'),
-
- (Qt.Key.Key_Space, Qt.KeyboardModifier.NoModifier, '<Space>'),
- (Qt.Key.Key_Space, Qt.KeyboardModifier.ShiftModifier, '<Shift+Space>'),
- (Qt.Key.Key_Tab, Qt.KeyboardModifier.ShiftModifier, '<Shift+Tab>'),
- (Qt.Key.Key_A, Qt.KeyboardModifier.ControlModifier, '<Ctrl+a>'),
- (Qt.Key.Key_A, Qt.KeyboardModifier.ControlModifier | Qt.KeyboardModifier.ShiftModifier, '<Ctrl+Shift+a>'),
- (Qt.Key.Key_A,
- Qt.KeyboardModifier.ControlModifier | Qt.KeyboardModifier.AltModifier | Qt.KeyboardModifier.MetaModifier | Qt.KeyboardModifier.ShiftModifier,
+ (core.Qt.Key.Key_A, core.Qt.KeyboardModifier.NoModifier, 'a'),
+ (core.Qt.Key.Key_A, core.Qt.KeyboardModifier.ShiftModifier, 'A'),
+
+ (core.Qt.Key.Key_Space, core.Qt.KeyboardModifier.NoModifier, '<Space>'),
+ (core.Qt.Key.Key_Space, core.Qt.KeyboardModifier.ShiftModifier, '<Shift+Space>'),
+ (core.Qt.Key.Key_Tab, core.Qt.KeyboardModifier.ShiftModifier, '<Shift+Tab>'),
+ (core.Qt.Key.Key_A, core.Qt.KeyboardModifier.ControlModifier, '<Ctrl+a>'),
+ (core.Qt.Key.Key_A, core.Qt.KeyboardModifier.ControlModifier | core.Qt.KeyboardModifier.ShiftModifier, '<Ctrl+Shift+a>'),
+ (core.Qt.Key.Key_A,
+ core.Qt.KeyboardModifier.ControlModifier | core.Qt.KeyboardModifier.AltModifier | core.Qt.KeyboardModifier.MetaModifier | core.Qt.KeyboardModifier.ShiftModifier,
'<Meta+Ctrl+Alt+Shift+a>'),
- (ord('Œ'), Qt.KeyboardModifier.NoModifier, '<Œ>'),
- (ord('Œ'), Qt.KeyboardModifier.ShiftModifier, '<Shift+Œ>'),
- (ord('Œ'), Qt.KeyboardModifier.GroupSwitchModifier, '<AltGr+Œ>'),
- (ord('Œ'), Qt.KeyboardModifier.GroupSwitchModifier | Qt.KeyboardModifier.ShiftModifier, '<AltGr+Shift+Œ>'),
-
- (Qt.Key.Key_Shift, Qt.KeyboardModifier.ShiftModifier, '<Shift>'),
- (Qt.Key.Key_Shift, Qt.KeyboardModifier.ShiftModifier | Qt.KeyboardModifier.ControlModifier, '<Ctrl+Shift>'),
- (Qt.Key.Key_Alt, Qt.KeyboardModifier.AltModifier, '<Alt>'),
- (Qt.Key.Key_Shift, Qt.KeyboardModifier.GroupSwitchModifier | Qt.KeyboardModifier.ShiftModifier, '<AltGr+Shift>'),
- (Qt.Key.Key_AltGr, Qt.KeyboardModifier.GroupSwitchModifier, '<AltGr>'),
+ (ord('Œ'), core.Qt.KeyboardModifier.NoModifier, '<Œ>'),
+ (ord('Œ'), core.Qt.KeyboardModifier.ShiftModifier, '<Shift+Œ>'),
+ (ord('Œ'), core.Qt.KeyboardModifier.GroupSwitchModifier, '<AltGr+Œ>'),
+ (ord('Œ'), core.Qt.KeyboardModifier.GroupSwitchModifier | core.Qt.KeyboardModifier.ShiftModifier, '<AltGr+Shift+Œ>'),
+
+ (core.Qt.Key.Key_Shift, core.Qt.KeyboardModifier.ShiftModifier, '<Shift>'),
+ (core.Qt.Key.Key_Shift, core.Qt.KeyboardModifier.ShiftModifier | core.Qt.KeyboardModifier.ControlModifier, '<Ctrl+Shift>'),
+ (core.Qt.Key.Key_Alt, core.Qt.KeyboardModifier.AltModifier, '<Alt>'),
+ (core.Qt.Key.Key_Shift, core.Qt.KeyboardModifier.GroupSwitchModifier | core.Qt.KeyboardModifier.ShiftModifier, '<AltGr+Shift>'),
+ (core.Qt.Key.Key_AltGr, core.Qt.KeyboardModifier.GroupSwitchModifier, '<AltGr>'),
])
def test_key_info_str(key, modifiers, expected):
assert str(keyutils.KeyInfo(key, modifiers)) == expected
def test_key_info_repr():
- info = keyutils.KeyInfo(Qt.Key.Key_A, Qt.KeyboardModifier.ShiftModifier)
+ info = keyutils.KeyInfo(core.Qt.Key.Key_A, core.Qt.KeyboardModifier.ShiftModifier)
expected = (
"<qutebrowser.keyinput.keyutils.KeyInfo "
"key='Key_A' modifiers='ShiftModifier' text='A'>")
@@ -182,14 +179,14 @@ def test_key_info_repr():
@pytest.mark.parametrize('info1, info2, equal', [
- (keyutils.KeyInfo(Qt.Key.Key_A, Qt.KeyboardModifier.NoModifier),
- keyutils.KeyInfo(Qt.Key.Key_A, Qt.KeyboardModifier.NoModifier),
+ (keyutils.KeyInfo(core.Qt.Key.Key_A, core.Qt.KeyboardModifier.NoModifier),
+ keyutils.KeyInfo(core.Qt.Key.Key_A, core.Qt.KeyboardModifier.NoModifier),
True),
- (keyutils.KeyInfo(Qt.Key.Key_A, Qt.KeyboardModifier.NoModifier),
- keyutils.KeyInfo(Qt.Key.Key_B, Qt.KeyboardModifier.NoModifier),
+ (keyutils.KeyInfo(core.Qt.Key.Key_A, core.Qt.KeyboardModifier.NoModifier),
+ keyutils.KeyInfo(core.Qt.Key.Key_B, core.Qt.KeyboardModifier.NoModifier),
False),
- (keyutils.KeyInfo(Qt.Key.Key_A, Qt.KeyboardModifier.NoModifier),
- keyutils.KeyInfo(Qt.Key.Key_B, Qt.KeyboardModifier.ControlModifier),
+ (keyutils.KeyInfo(core.Qt.Key.Key_A, core.Qt.KeyboardModifier.NoModifier),
+ keyutils.KeyInfo(core.Qt.Key.Key_B, core.Qt.KeyboardModifier.ControlModifier),
False),
])
def test_hash(info1, info2, equal):
@@ -197,12 +194,12 @@ def test_hash(info1, info2, equal):
@pytest.mark.parametrize('key, modifiers, text, expected', [
- (0xd83c, Qt.KeyboardModifier.NoModifier, '🏻', '<🏻>'),
- (0xd867, Qt.KeyboardModifier.NoModifier, '𩷶', '<𩷶>'),
- (0xd867, Qt.KeyboardModifier.ShiftModifier, '𩷶', '<Shift+𩷶>'),
+ (0xd83c, core.Qt.KeyboardModifier.NoModifier, '🏻', '<🏻>'),
+ (0xd867, core.Qt.KeyboardModifier.NoModifier, '𩷶', '<𩷶>'),
+ (0xd867, core.Qt.KeyboardModifier.ShiftModifier, '𩷶', '<Shift+𩷶>'),
])
def test_surrogates(key, modifiers, text, expected, pyqt_enum_workaround):
- evt = QKeyEvent(QEvent.Type.KeyPress, key, modifiers, text)
+ evt = gui.QKeyEvent(core.QEvent.Type.KeyPress, key, modifiers, text)
with pyqt_enum_workaround():
info = keyutils.KeyInfo.from_event(evt)
assert str(info) == expected
@@ -211,7 +208,7 @@ def test_surrogates(key, modifiers, text, expected, pyqt_enum_workaround):
@pytest.mark.parametrize('keys, expected', [
([0x1f3fb], '<🏻>'),
([0x29df6], '<𩷶>'),
- ([Qt.Key.Key_Shift, 0x29df6], '<Shift><𩷶>'),
+ ([core.Qt.Key.Key_Shift, 0x29df6], '<Shift><𩷶>'),
([0x1f468, 0x200d, 0x1f468, 0x200d, 0x1f466], '<👨><‍><👨><‍><👦>'),
])
def test_surrogate_sequences(keys, expected, pyqt_enum_workaround):
@@ -223,7 +220,7 @@ def test_surrogate_sequences(keys, expected, pyqt_enum_workaround):
# This shouldn't happen, but if it does we should handle it well
def test_surrogate_error(pyqt_enum_workaround):
- evt = QKeyEvent(QEvent.Type.KeyPress, 0xd83e, Qt.KeyboardModifier.NoModifier, '🤞🏻')
+ evt = gui.QKeyEvent(core.QEvent.Type.KeyPress, 0xd83e, core.Qt.KeyboardModifier.NoModifier, '🤞🏻')
with pytest.raises(keyutils.KeyParseError), pyqt_enum_workaround():
keyutils.KeyInfo.from_event(evt)
@@ -259,11 +256,11 @@ class TestKeySequence:
def test_init(self):
seq = keyutils.KeySequence(
- keyutils.KeyInfo(Qt.Key.Key_A),
- keyutils.KeyInfo(Qt.Key.Key_B),
- keyutils.KeyInfo(Qt.Key.Key_C),
- keyutils.KeyInfo(Qt.Key.Key_D),
- keyutils.KeyInfo(Qt.Key.Key_E),
+ keyutils.KeyInfo(core.Qt.Key.Key_A),
+ keyutils.KeyInfo(core.Qt.Key.Key_B),
+ keyutils.KeyInfo(core.Qt.Key.Key_C),
+ keyutils.KeyInfo(core.Qt.Key.Key_D),
+ keyutils.KeyInfo(core.Qt.Key.Key_E),
)
assert len(seq._sequences) == 2
assert len(seq._sequences[0]) == 4
@@ -273,7 +270,7 @@ class TestKeySequence:
seq = keyutils.KeySequence()
assert not seq
- @pytest.mark.parametrize('key', [Qt.Key.Key_unknown, keyutils._NIL_KEY])
+ @pytest.mark.parametrize('key', [core.Qt.Key.Key_unknown, keyutils._NIL_KEY])
def test_init_unknown(self, key):
with pytest.raises(keyutils.KeyParseError):
keyutils.KeySequence(keyutils.KeyInfo(key))
@@ -304,17 +301,17 @@ class TestKeySequence:
assert str(keyutils.KeySequence.parse(orig)) == normalized
def test_iter(self):
- infos = [keyutils.KeyInfo(Qt.Key.Key_A, Qt.KeyboardModifier.ControlModifier),
- keyutils.KeyInfo(Qt.Key.Key_B, Qt.KeyboardModifier.ShiftModifier),
- keyutils.KeyInfo(Qt.Key.Key_C),
- keyutils.KeyInfo(Qt.Key.Key_D),
- keyutils.KeyInfo(Qt.Key.Key_E)]
+ infos = [keyutils.KeyInfo(core.Qt.Key.Key_A, core.Qt.KeyboardModifier.ControlModifier),
+ keyutils.KeyInfo(core.Qt.Key.Key_B, core.Qt.KeyboardModifier.ShiftModifier),
+ keyutils.KeyInfo(core.Qt.Key.Key_C),
+ keyutils.KeyInfo(core.Qt.Key.Key_D),
+ keyutils.KeyInfo(core.Qt.Key.Key_E)]
seq = keyutils.KeySequence(*infos)
assert list(seq) == infos
def test_repr(self):
- seq = keyutils.KeySequence(keyutils.KeyInfo(Qt.Key.Key_A, Qt.KeyboardModifier.ControlModifier),
- keyutils.KeyInfo(Qt.Key.Key_B, Qt.KeyboardModifier.ShiftModifier))
+ seq = keyutils.KeySequence(keyutils.KeyInfo(core.Qt.Key.Key_A, core.Qt.KeyboardModifier.ControlModifier),
+ keyutils.KeyInfo(core.Qt.Key.Key_B, core.Qt.KeyboardModifier.ShiftModifier))
assert repr(seq) == ("<qutebrowser.keyinput.keyutils.KeySequence "
"keys='<Ctrl+a>B'>")
@@ -386,7 +383,7 @@ class TestKeySequence:
def test_getitem(self):
seq = keyutils.KeySequence.parse('ab')
- expected = keyutils.KeyInfo(Qt.Key.Key_B, Qt.KeyboardModifier.NoModifier)
+ expected = keyutils.KeyInfo(core.Qt.Key.Key_B, core.Qt.KeyboardModifier.NoModifier)
assert seq[1] == expected
def test_getitem_slice(self):
@@ -399,27 +396,27 @@ class TestKeySequence:
MATCH_TESTS = [
# config: abcd
- ('abc', 'abcd', QKeySequence.SequenceMatch.PartialMatch),
- ('abcd', 'abcd', QKeySequence.SequenceMatch.ExactMatch),
- ('ax', 'abcd', QKeySequence.SequenceMatch.NoMatch),
- ('abcdef', 'abcd', QKeySequence.SequenceMatch.NoMatch),
+ ('abc', 'abcd', gui.QKeySequence.SequenceMatch.PartialMatch),
+ ('abcd', 'abcd', gui.QKeySequence.SequenceMatch.ExactMatch),
+ ('ax', 'abcd', gui.QKeySequence.SequenceMatch.NoMatch),
+ ('abcdef', 'abcd', gui.QKeySequence.SequenceMatch.NoMatch),
# config: abcd ef
- ('abc', 'abcdef', QKeySequence.SequenceMatch.PartialMatch),
- ('abcde', 'abcdef', QKeySequence.SequenceMatch.PartialMatch),
- ('abcd', 'abcdef', QKeySequence.SequenceMatch.PartialMatch),
- ('abcdx', 'abcdef', QKeySequence.SequenceMatch.NoMatch),
- ('ax', 'abcdef', QKeySequence.SequenceMatch.NoMatch),
- ('abcdefg', 'abcdef', QKeySequence.SequenceMatch.NoMatch),
- ('abcdef', 'abcdef', QKeySequence.SequenceMatch.ExactMatch),
+ ('abc', 'abcdef', gui.QKeySequence.SequenceMatch.PartialMatch),
+ ('abcde', 'abcdef', gui.QKeySequence.SequenceMatch.PartialMatch),
+ ('abcd', 'abcdef', gui.QKeySequence.SequenceMatch.PartialMatch),
+ ('abcdx', 'abcdef', gui.QKeySequence.SequenceMatch.NoMatch),
+ ('ax', 'abcdef', gui.QKeySequence.SequenceMatch.NoMatch),
+ ('abcdefg', 'abcdef', gui.QKeySequence.SequenceMatch.NoMatch),
+ ('abcdef', 'abcdef', gui.QKeySequence.SequenceMatch.ExactMatch),
# other examples
- ('ab', 'a', QKeySequence.SequenceMatch.NoMatch),
+ ('ab', 'a', gui.QKeySequence.SequenceMatch.NoMatch),
# empty strings
- ('', '', QKeySequence.SequenceMatch.ExactMatch),
- ('', 'a', QKeySequence.SequenceMatch.PartialMatch),
- ('a', '', QKeySequence.SequenceMatch.NoMatch)]
+ ('', '', gui.QKeySequence.SequenceMatch.ExactMatch),
+ ('', 'a', gui.QKeySequence.SequenceMatch.PartialMatch),
+ ('a', '', gui.QKeySequence.SequenceMatch.NoMatch)]
@pytest.mark.parametrize('entered, configured, match_type', MATCH_TESTS)
def test_matches(self, entered, configured, match_type):
@@ -428,75 +425,75 @@ class TestKeySequence:
assert entered.matches(configured) == match_type
@pytest.mark.parametrize('old, key, modifiers, text, expected', [
- ('a', Qt.Key.Key_B, Qt.KeyboardModifier.NoModifier, 'b', 'ab'),
- ('a', Qt.Key.Key_B, Qt.KeyboardModifier.ShiftModifier, 'B', 'aB'),
- ('a', Qt.Key.Key_B, Qt.KeyboardModifier.AltModifier | Qt.KeyboardModifier.ShiftModifier, 'B',
+ ('a', core.Qt.Key.Key_B, core.Qt.KeyboardModifier.NoModifier, 'b', 'ab'),
+ ('a', core.Qt.Key.Key_B, core.Qt.KeyboardModifier.ShiftModifier, 'B', 'aB'),
+ ('a', core.Qt.Key.Key_B, core.Qt.KeyboardModifier.AltModifier | core.Qt.KeyboardModifier.ShiftModifier, 'B',
'a<Alt+Shift+b>'),
# Modifier stripping with symbols
- ('', Qt.Key.Key_Colon, Qt.KeyboardModifier.NoModifier, ':', ':'),
- ('', Qt.Key.Key_Colon, Qt.KeyboardModifier.ShiftModifier, ':', ':'),
- ('', Qt.Key.Key_Colon, Qt.KeyboardModifier.AltModifier | Qt.KeyboardModifier.ShiftModifier, ':',
+ ('', core.Qt.Key.Key_Colon, core.Qt.KeyboardModifier.NoModifier, ':', ':'),
+ ('', core.Qt.Key.Key_Colon, core.Qt.KeyboardModifier.ShiftModifier, ':', ':'),
+ ('', core.Qt.Key.Key_Colon, core.Qt.KeyboardModifier.AltModifier | core.Qt.KeyboardModifier.ShiftModifier, ':',
'<Alt+Shift+:>'),
# Swapping Control/Meta on macOS
- ('', Qt.Key.Key_A, Qt.KeyboardModifier.ControlModifier, '',
+ ('', core.Qt.Key.Key_A, core.Qt.KeyboardModifier.ControlModifier, '',
'<Meta+A>' if utils.is_mac else '<Ctrl+A>'),
- ('', Qt.Key.Key_A, Qt.KeyboardModifier.ControlModifier | Qt.KeyboardModifier.ShiftModifier, '',
+ ('', core.Qt.Key.Key_A, core.Qt.KeyboardModifier.ControlModifier | core.Qt.KeyboardModifier.ShiftModifier, '',
'<Meta+Shift+A>' if utils.is_mac else '<Ctrl+Shift+A>'),
- ('', Qt.Key.Key_A, Qt.KeyboardModifier.MetaModifier, '',
+ ('', core.Qt.Key.Key_A, core.Qt.KeyboardModifier.MetaModifier, '',
'<Ctrl+A>' if utils.is_mac else '<Meta+A>'),
# Handling of Backtab
- ('', Qt.Key.Key_Backtab, Qt.KeyboardModifier.NoModifier, '', '<Backtab>'),
- ('', Qt.Key.Key_Backtab, Qt.KeyboardModifier.ShiftModifier, '', '<Shift+Tab>'),
- ('', Qt.Key.Key_Backtab, Qt.KeyboardModifier.AltModifier | Qt.KeyboardModifier.ShiftModifier, '',
+ ('', core.Qt.Key.Key_Backtab, core.Qt.KeyboardModifier.NoModifier, '', '<Backtab>'),
+ ('', core.Qt.Key.Key_Backtab, core.Qt.KeyboardModifier.ShiftModifier, '', '<Shift+Tab>'),
+ ('', core.Qt.Key.Key_Backtab, core.Qt.KeyboardModifier.AltModifier | core.Qt.KeyboardModifier.ShiftModifier, '',
'<Alt+Shift+Tab>'),
# Stripping of Qt.KeyboardModifier.GroupSwitchModifier
- ('', Qt.Key.Key_A, Qt.KeyboardModifier.GroupSwitchModifier, 'a', 'a'),
+ ('', core.Qt.Key.Key_A, core.Qt.KeyboardModifier.GroupSwitchModifier, 'a', 'a'),
])
def test_append_event(self, old, key, modifiers, text, expected):
seq = keyutils.KeySequence.parse(old)
- event = QKeyEvent(QEvent.Type.KeyPress, key, modifiers, text)
+ event = gui.QKeyEvent(core.QEvent.Type.KeyPress, key, modifiers, text)
new = seq.append_event(event)
assert new == keyutils.KeySequence.parse(expected)
@pytest.mark.fake_os('mac')
@pytest.mark.parametrize('modifiers, expected', [
- (Qt.KeyboardModifier.ControlModifier,
- Qt.KeyboardModifier.MetaModifier),
- (Qt.KeyboardModifier.MetaModifier,
- Qt.KeyboardModifier.ControlModifier),
- (Qt.KeyboardModifier.ControlModifier | Qt.KeyboardModifier.MetaModifier,
- Qt.KeyboardModifier.ControlModifier | Qt.KeyboardModifier.MetaModifier),
- (Qt.KeyboardModifier.ControlModifier | Qt.KeyboardModifier.ShiftModifier,
- Qt.KeyboardModifier.MetaModifier | Qt.KeyboardModifier.ShiftModifier),
- (Qt.KeyboardModifier.MetaModifier | Qt.KeyboardModifier.ShiftModifier,
- Qt.KeyboardModifier.ControlModifier | Qt.KeyboardModifier.ShiftModifier),
- (Qt.KeyboardModifier.ShiftModifier, Qt.KeyboardModifier.ShiftModifier),
+ (core.Qt.KeyboardModifier.ControlModifier,
+ core.Qt.KeyboardModifier.MetaModifier),
+ (core.Qt.KeyboardModifier.MetaModifier,
+ core.Qt.KeyboardModifier.ControlModifier),
+ (core.Qt.KeyboardModifier.ControlModifier | core.Qt.KeyboardModifier.MetaModifier,
+ core.Qt.KeyboardModifier.ControlModifier | core.Qt.KeyboardModifier.MetaModifier),
+ (core.Qt.KeyboardModifier.ControlModifier | core.Qt.KeyboardModifier.ShiftModifier,
+ core.Qt.KeyboardModifier.MetaModifier | core.Qt.KeyboardModifier.ShiftModifier),
+ (core.Qt.KeyboardModifier.MetaModifier | core.Qt.KeyboardModifier.ShiftModifier,
+ core.Qt.KeyboardModifier.ControlModifier | core.Qt.KeyboardModifier.ShiftModifier),
+ (core.Qt.KeyboardModifier.ShiftModifier, core.Qt.KeyboardModifier.ShiftModifier),
])
def test_fake_mac(self, modifiers, expected):
"""Make sure Control/Meta are swapped with a simulated Mac."""
seq = keyutils.KeySequence()
- info = keyutils.KeyInfo(key=Qt.Key.Key_A, modifiers=modifiers)
+ info = keyutils.KeyInfo(key=core.Qt.Key.Key_A, modifiers=modifiers)
new = seq.append_event(info.to_event())
- assert new[0] == keyutils.KeyInfo(Qt.Key.Key_A, expected)
+ assert new[0] == keyutils.KeyInfo(core.Qt.Key.Key_A, expected)
- @pytest.mark.parametrize('key', [Qt.Key.Key_unknown, 0x0])
+ @pytest.mark.parametrize('key', [core.Qt.Key.Key_unknown, 0x0])
def test_append_event_invalid(self, key):
seq = keyutils.KeySequence()
- event = QKeyEvent(QEvent.Type.KeyPress, key, Qt.KeyboardModifier.NoModifier, '')
+ event = gui.QKeyEvent(core.QEvent.Type.KeyPress, key, core.Qt.KeyboardModifier.NoModifier, '')
with pytest.raises(keyutils.KeyParseError):
seq.append_event(event)
def test_strip_modifiers(self):
- seq = keyutils.KeySequence(keyutils.KeyInfo(Qt.Key.Key_0),
- keyutils.KeyInfo(Qt.Key.Key_1, Qt.KeyboardModifier.KeypadModifier),
- keyutils.KeyInfo(Qt.Key.Key_A, Qt.KeyboardModifier.ControlModifier))
- expected = keyutils.KeySequence(keyutils.KeyInfo(Qt.Key.Key_0),
- keyutils.KeyInfo(Qt.Key.Key_1),
- keyutils.KeyInfo(Qt.Key.Key_A, Qt.KeyboardModifier.ControlModifier))
+ seq = keyutils.KeySequence(keyutils.KeyInfo(core.Qt.Key.Key_0),
+ keyutils.KeyInfo(core.Qt.Key.Key_1, core.Qt.KeyboardModifier.KeypadModifier),
+ keyutils.KeyInfo(core.Qt.Key.Key_A, core.Qt.KeyboardModifier.ControlModifier))
+ expected = keyutils.KeySequence(keyutils.KeyInfo(core.Qt.Key.Key_0),
+ keyutils.KeyInfo(core.Qt.Key.Key_1),
+ keyutils.KeyInfo(core.Qt.Key.Key_A, core.Qt.KeyboardModifier.ControlModifier))
assert seq.strip_modifiers() == expected
@pytest.mark.parametrize('inp, mappings, expected', [
@@ -514,31 +511,31 @@ class TestKeySequence:
@pytest.mark.parametrize('keystr, expected', [
('<Ctrl-Alt-y>',
- keyutils.KeySequence(keyutils.KeyInfo(Qt.Key.Key_Y, Qt.KeyboardModifier.ControlModifier | Qt.KeyboardModifier.AltModifier))),
- ('x', keyutils.KeySequence(keyutils.KeyInfo(Qt.Key.Key_X))),
- ('X', keyutils.KeySequence(keyutils.KeyInfo(Qt.Key.Key_X, Qt.KeyboardModifier.ShiftModifier))),
- ('<Escape>', keyutils.KeySequence(keyutils.KeyInfo(Qt.Key.Key_Escape))),
- ('xyz', keyutils.KeySequence(keyutils.KeyInfo(Qt.Key.Key_X), keyutils.KeyInfo(Qt.Key.Key_Y), keyutils.KeyInfo(Qt.Key.Key_Z))),
+ keyutils.KeySequence(keyutils.KeyInfo(core.Qt.Key.Key_Y, core.Qt.KeyboardModifier.ControlModifier | core.Qt.KeyboardModifier.AltModifier))),
+ ('x', keyutils.KeySequence(keyutils.KeyInfo(core.Qt.Key.Key_X))),
+ ('X', keyutils.KeySequence(keyutils.KeyInfo(core.Qt.Key.Key_X, core.Qt.KeyboardModifier.ShiftModifier))),
+ ('<Escape>', keyutils.KeySequence(keyutils.KeyInfo(core.Qt.Key.Key_Escape))),
+ ('xyz', keyutils.KeySequence(keyutils.KeyInfo(core.Qt.Key.Key_X), keyutils.KeyInfo(core.Qt.Key.Key_Y), keyutils.KeyInfo(core.Qt.Key.Key_Z))),
('<Control-x><Meta-y>',
- keyutils.KeySequence(keyutils.KeyInfo(Qt.Key.Key_X, Qt.KeyboardModifier.ControlModifier),
- keyutils.KeyInfo(Qt.Key.Key_Y, Qt.KeyboardModifier.MetaModifier))),
-
- ('<Shift-x>', keyutils.KeySequence(keyutils.KeyInfo(Qt.Key.Key_X, Qt.KeyboardModifier.ShiftModifier))),
- ('<Alt-x>', keyutils.KeySequence(keyutils.KeyInfo(Qt.Key.Key_X, Qt.KeyboardModifier.AltModifier))),
- ('<Control-x>', keyutils.KeySequence(keyutils.KeyInfo(Qt.Key.Key_X, Qt.KeyboardModifier.ControlModifier))),
- ('<Meta-x>', keyutils.KeySequence(keyutils.KeyInfo(Qt.Key.Key_X, Qt.KeyboardModifier.MetaModifier))),
- ('<Num-x>', keyutils.KeySequence(keyutils.KeyInfo(Qt.Key.Key_X, Qt.KeyboardModifier.KeypadModifier))),
-
- ('>', keyutils.KeySequence(keyutils.KeyInfo(Qt.Key.Key_Greater))),
- ('<', keyutils.KeySequence(keyutils.KeyInfo(Qt.Key.Key_Less))),
- ('a>', keyutils.KeySequence(keyutils.KeyInfo(Qt.Key.Key_A), keyutils.KeyInfo(Qt.Key.Key_Greater))),
- ('a<', keyutils.KeySequence(keyutils.KeyInfo(Qt.Key.Key_A), keyutils.KeyInfo(Qt.Key.Key_Less))),
- ('>a', keyutils.KeySequence(keyutils.KeyInfo(Qt.Key.Key_Greater), keyutils.KeyInfo(Qt.Key.Key_A))),
- ('<a', keyutils.KeySequence(keyutils.KeyInfo(Qt.Key.Key_Less), keyutils.KeyInfo(Qt.Key.Key_A))),
+ keyutils.KeySequence(keyutils.KeyInfo(core.Qt.Key.Key_X, core.Qt.KeyboardModifier.ControlModifier),
+ keyutils.KeyInfo(core.Qt.Key.Key_Y, core.Qt.KeyboardModifier.MetaModifier))),
+
+ ('<Shift-x>', keyutils.KeySequence(keyutils.KeyInfo(core.Qt.Key.Key_X, core.Qt.KeyboardModifier.ShiftModifier))),
+ ('<Alt-x>', keyutils.KeySequence(keyutils.KeyInfo(core.Qt.Key.Key_X, core.Qt.KeyboardModifier.AltModifier))),
+ ('<Control-x>', keyutils.KeySequence(keyutils.KeyInfo(core.Qt.Key.Key_X, core.Qt.KeyboardModifier.ControlModifier))),
+ ('<Meta-x>', keyutils.KeySequence(keyutils.KeyInfo(core.Qt.Key.Key_X, core.Qt.KeyboardModifier.MetaModifier))),
+ ('<Num-x>', keyutils.KeySequence(keyutils.KeyInfo(core.Qt.Key.Key_X, core.Qt.KeyboardModifier.KeypadModifier))),
+
+ ('>', keyutils.KeySequence(keyutils.KeyInfo(core.Qt.Key.Key_Greater))),
+ ('<', keyutils.KeySequence(keyutils.KeyInfo(core.Qt.Key.Key_Less))),
+ ('a>', keyutils.KeySequence(keyutils.KeyInfo(core.Qt.Key.Key_A), keyutils.KeyInfo(core.Qt.Key.Key_Greater))),
+ ('a<', keyutils.KeySequence(keyutils.KeyInfo(core.Qt.Key.Key_A), keyutils.KeyInfo(core.Qt.Key.Key_Less))),
+ ('>a', keyutils.KeySequence(keyutils.KeyInfo(core.Qt.Key.Key_Greater), keyutils.KeyInfo(core.Qt.Key.Key_A))),
+ ('<a', keyutils.KeySequence(keyutils.KeyInfo(core.Qt.Key.Key_Less), keyutils.KeyInfo(core.Qt.Key.Key_A))),
('<alt+greater>',
- keyutils.KeySequence(keyutils.KeyInfo(Qt.Key.Key_Greater, Qt.KeyboardModifier.AltModifier))),
+ keyutils.KeySequence(keyutils.KeyInfo(core.Qt.Key.Key_Greater, core.Qt.KeyboardModifier.AltModifier))),
('<alt+less>',
- keyutils.KeySequence(keyutils.KeyInfo(Qt.Key.Key_Less, Qt.KeyboardModifier.AltModifier))),
+ keyutils.KeySequence(keyutils.KeyInfo(core.Qt.Key.Key_Less, core.Qt.KeyboardModifier.AltModifier))),
('<alt+<>', keyutils.KeyParseError),
('<alt+>>', keyutils.KeyParseError),
@@ -564,67 +561,67 @@ class TestKeySequence:
def test_key_info_from_event():
- ev = QKeyEvent(QEvent.Type.KeyPress, Qt.Key.Key_A, Qt.KeyboardModifier.ShiftModifier, 'A')
+ ev = gui.QKeyEvent(core.QEvent.Type.KeyPress, core.Qt.Key.Key_A, core.Qt.KeyboardModifier.ShiftModifier, 'A')
info = keyutils.KeyInfo.from_event(ev)
- assert info.key == Qt.Key.Key_A
- assert info.modifiers == Qt.KeyboardModifier.ShiftModifier
+ assert info.key == core.Qt.Key.Key_A
+ assert info.modifiers == core.Qt.KeyboardModifier.ShiftModifier
def test_key_info_to_event():
- info = keyutils.KeyInfo(Qt.Key.Key_A, Qt.KeyboardModifier.ShiftModifier)
+ info = keyutils.KeyInfo(core.Qt.Key.Key_A, core.Qt.KeyboardModifier.ShiftModifier)
ev = info.to_event()
- assert ev.key() == Qt.Key.Key_A
- assert ev.modifiers() == Qt.KeyboardModifier.ShiftModifier
+ assert ev.key() == core.Qt.Key.Key_A
+ assert ev.modifiers() == core.Qt.KeyboardModifier.ShiftModifier
assert ev.text() == 'A'
def test_key_info_to_qt():
- info = keyutils.KeyInfo(Qt.Key.Key_A, Qt.KeyboardModifier.ShiftModifier)
- assert info.to_qt() == Qt.Key.Key_A | Qt.KeyboardModifier.ShiftModifier
+ info = keyutils.KeyInfo(core.Qt.Key.Key_A, core.Qt.KeyboardModifier.ShiftModifier)
+ assert info.to_qt() == core.Qt.Key.Key_A | core.Qt.KeyboardModifier.ShiftModifier
@pytest.mark.parametrize('key, printable', [
- (Qt.Key.Key_Control, False),
- (Qt.Key.Key_Escape, False),
- (Qt.Key.Key_Tab, False),
- (Qt.Key.Key_Backtab, False),
- (Qt.Key.Key_Backspace, False),
- (Qt.Key.Key_Return, False),
- (Qt.Key.Key_Enter, False),
- (Qt.Key.Key_Space, False),
+ (core.Qt.Key.Key_Control, False),
+ (core.Qt.Key.Key_Escape, False),
+ (core.Qt.Key.Key_Tab, False),
+ (core.Qt.Key.Key_Backtab, False),
+ (core.Qt.Key.Key_Backspace, False),
+ (core.Qt.Key.Key_Return, False),
+ (core.Qt.Key.Key_Enter, False),
+ (core.Qt.Key.Key_Space, False),
(0x0, False), # Used by Qt for unknown keys
- (Qt.Key.Key_ydiaeresis, True),
- (Qt.Key.Key_X, True),
+ (core.Qt.Key.Key_ydiaeresis, True),
+ (core.Qt.Key.Key_X, True),
])
def test_is_printable(key, printable):
assert keyutils._is_printable(key) == printable
- info = keyutils.KeyInfo(key, Qt.KeyboardModifier.NoModifier)
+ info = keyutils.KeyInfo(key, core.Qt.KeyboardModifier.NoModifier)
assert info.is_special() != printable
@pytest.mark.parametrize('key, modifiers, special', [
- (Qt.Key.Key_Escape, Qt.KeyboardModifier.NoModifier, True),
- (Qt.Key.Key_Escape, Qt.KeyboardModifier.ShiftModifier, True),
- (Qt.Key.Key_Escape, Qt.KeyboardModifier.ControlModifier, True),
- (Qt.Key.Key_X, Qt.KeyboardModifier.ControlModifier, True),
- (Qt.Key.Key_X, Qt.KeyboardModifier.NoModifier, False),
- (Qt.Key.Key_2, Qt.KeyboardModifier.KeypadModifier, True),
- (Qt.Key.Key_2, Qt.KeyboardModifier.NoModifier, False),
- (Qt.Key.Key_Shift, Qt.KeyboardModifier.ShiftModifier, True),
- (Qt.Key.Key_Control, Qt.KeyboardModifier.ControlModifier, True),
- (Qt.Key.Key_Alt, Qt.KeyboardModifier.AltModifier, True),
- (Qt.Key.Key_Meta, Qt.KeyboardModifier.MetaModifier, True),
- (Qt.Key.Key_Mode_switch, Qt.KeyboardModifier.GroupSwitchModifier, True),
+ (core.Qt.Key.Key_Escape, core.Qt.KeyboardModifier.NoModifier, True),
+ (core.Qt.Key.Key_Escape, core.Qt.KeyboardModifier.ShiftModifier, True),
+ (core.Qt.Key.Key_Escape, core.Qt.KeyboardModifier.ControlModifier, True),
+ (core.Qt.Key.Key_X, core.Qt.KeyboardModifier.ControlModifier, True),
+ (core.Qt.Key.Key_X, core.Qt.KeyboardModifier.NoModifier, False),
+ (core.Qt.Key.Key_2, core.Qt.KeyboardModifier.KeypadModifier, True),
+ (core.Qt.Key.Key_2, core.Qt.KeyboardModifier.NoModifier, False),
+ (core.Qt.Key.Key_Shift, core.Qt.KeyboardModifier.ShiftModifier, True),
+ (core.Qt.Key.Key_Control, core.Qt.KeyboardModifier.ControlModifier, True),
+ (core.Qt.Key.Key_Alt, core.Qt.KeyboardModifier.AltModifier, True),
+ (core.Qt.Key.Key_Meta, core.Qt.KeyboardModifier.MetaModifier, True),
+ (core.Qt.Key.Key_Mode_switch, core.Qt.KeyboardModifier.GroupSwitchModifier, True),
])
def test_is_special(key, modifiers, special):
assert keyutils.KeyInfo(key, modifiers).is_special() == special
@pytest.mark.parametrize('key, ismodifier', [
- (Qt.Key.Key_Control, True),
- (Qt.Key.Key_X, False),
- (Qt.Key.Key_Super_L, False), # Modifier but not in _MODIFIER_MAP
+ (core.Qt.Key.Key_Control, True),
+ (core.Qt.Key.Key_X, False),
+ (core.Qt.Key.Key_Super_L, False), # Modifier but not in _MODIFIER_MAP
])
def test_is_modifier_key(key, ismodifier):
assert keyutils.KeyInfo(key).is_modifier_key() == ismodifier
@@ -639,7 +636,7 @@ def test_is_modifier_key(key, ismodifier):
keyutils.KeyInfo,
])
def test_non_plain(func):
- comb = Qt.Key.Key_X | Qt.KeyboardModifier.ControlModifier
+ comb = core.Qt.Key.Key_X | core.Qt.KeyboardModifier.ControlModifier
if machinery.IS_QT6:
# QKeyCombination
comb = comb.toCombined()
diff --git a/tests/unit/keyinput/test_modeman.py b/tests/unit/keyinput/test_modeman.py
index 8d9a98002..5bcfa553b 100644
--- a/tests/unit/keyinput/test_modeman.py
+++ b/tests/unit/keyinput/test_modeman.py
@@ -19,20 +19,18 @@
import pytest
-from qutebrowser.qt.core import Qt, QObject, pyqtSignal
-from qutebrowser.qt.gui import QKeyEvent, QKeySequence
-
from qutebrowser.utils import usertypes
from qutebrowser.keyinput import keyutils
from qutebrowser.misc import objects
+from qutebrowser.qt import gui, core
-class FakeKeyparser(QObject):
+class FakeKeyparser(core.QObject):
"""A fake BaseKeyParser which doesn't handle anything."""
- keystring_updated = pyqtSignal(str)
- request_leave = pyqtSignal(usertypes.KeyMode, str, bool)
+ keystring_updated = core.pyqtSignal(str)
+ request_leave = core.pyqtSignal(usertypes.KeyMode, str, bool)
def __init__(self):
super().__init__()
@@ -40,11 +38,11 @@ class FakeKeyparser(QObject):
def handle(
self,
- evt: QKeyEvent,
+ evt: gui.QKeyEvent,
*,
dry_run: bool = False,
- ) -> QKeySequence.SequenceMatch:
- return QKeySequence.SequenceMatch.NoMatch
+ ) -> gui.QKeySequence.SequenceMatch:
+ return gui.QKeySequence.SequenceMatch.NoMatch
@pytest.fixture
@@ -59,11 +57,11 @@ def set_qapp(monkeypatch, qapp):
@pytest.mark.parametrize('key, modifiers, filtered', [
- (Qt.Key.Key_A, Qt.KeyboardModifier.NoModifier, True),
- (Qt.Key.Key_Up, Qt.KeyboardModifier.NoModifier, False),
+ (core.Qt.Key.Key_A, core.Qt.KeyboardModifier.NoModifier, True),
+ (core.Qt.Key.Key_Up, core.Qt.KeyboardModifier.NoModifier, False),
# https://github.com/qutebrowser/qutebrowser/issues/1207
- (Qt.Key.Key_A, Qt.KeyboardModifier.ShiftModifier, True),
- (Qt.Key.Key_A, Qt.KeyboardModifier.ShiftModifier | Qt.KeyboardModifier.ControlModifier, False),
+ (core.Qt.Key.Key_A, core.Qt.KeyboardModifier.ShiftModifier, True),
+ (core.Qt.Key.Key_A, core.Qt.KeyboardModifier.ShiftModifier | core.Qt.KeyboardModifier.ControlModifier, False),
])
def test_non_alphanumeric(key, modifiers, filtered, modeman):
"""Make sure non-alphanumeric keys are passed through correctly."""
diff --git a/tests/unit/keyinput/test_modeparsers.py b/tests/unit/keyinput/test_modeparsers.py
index b997b0ab9..a1ffcc81a 100644
--- a/tests/unit/keyinput/test_modeparsers.py
+++ b/tests/unit/keyinput/test_modeparsers.py
@@ -19,8 +19,7 @@
"""Tests for mode parsers."""
-from qutebrowser.qt.core import Qt
-from qutebrowser.qt.gui import QKeySequence
+from qutebrowser.qt import gui, core
import pytest
@@ -66,7 +65,7 @@ class TestsNormalKeyParser:
# Press 'b' for a partial match.
# Then we check if the timer has been set up correctly
- keyparser.handle(keyutils.KeyInfo(Qt.Key.Key_B, Qt.KeyboardModifier.NoModifier).to_event())
+ keyparser.handle(keyutils.KeyInfo(core.Qt.Key.Key_B, core.Qt.KeyboardModifier.NoModifier).to_event())
assert timer.isSingleShot()
assert timer.interval() == 100
assert timer.isActive()
@@ -131,11 +130,11 @@ class TestHintKeyParser:
assert len(seq) == 2
match = keyparser.handle(seq[0].to_event())
- assert match == QKeySequence.SequenceMatch.PartialMatch
+ assert match == gui.QKeySequence.SequenceMatch.PartialMatch
assert hintmanager.keystr == prefix
match = keyparser.handle(seq[1].to_event())
- assert match == QKeySequence.SequenceMatch.ExactMatch
+ assert match == gui.QKeySequence.SequenceMatch.ExactMatch
assert hintmanager.keystr == hint
def test_match_key_mappings(self, config_stub, keyparser, hintmanager,
@@ -148,11 +147,11 @@ class TestHintKeyParser:
assert len(seq) == 2
match = keyparser.handle(seq[0].to_event())
- assert match == QKeySequence.SequenceMatch.PartialMatch
+ assert match == gui.QKeySequence.SequenceMatch.PartialMatch
assert hintmanager.keystr == 'a'
match = keyparser.handle(seq[1].to_event())
- assert match == QKeySequence.SequenceMatch.ExactMatch
+ assert match == gui.QKeySequence.SequenceMatch.ExactMatch
assert hintmanager.keystr == 'as'
def test_command(self, keyparser, config_stub, hintmanager, commandrunner):
@@ -163,17 +162,17 @@ class TestHintKeyParser:
keyparser.update_bindings(['xabcy'])
steps = [
- (Qt.Key.Key_X, QKeySequence.SequenceMatch.PartialMatch, 'x'),
- (Qt.Key.Key_A, QKeySequence.SequenceMatch.PartialMatch, ''),
- (Qt.Key.Key_B, QKeySequence.SequenceMatch.PartialMatch, ''),
- (Qt.Key.Key_C, QKeySequence.SequenceMatch.ExactMatch, ''),
+ (core.Qt.Key.Key_X, gui.QKeySequence.SequenceMatch.PartialMatch, 'x'),
+ (core.Qt.Key.Key_A, gui.QKeySequence.SequenceMatch.PartialMatch, ''),
+ (core.Qt.Key.Key_B, gui.QKeySequence.SequenceMatch.PartialMatch, ''),
+ (core.Qt.Key.Key_C, gui.QKeySequence.SequenceMatch.ExactMatch, ''),
]
for key, expected_match, keystr in steps:
- info = keyutils.KeyInfo(key, Qt.KeyboardModifier.NoModifier)
+ info = keyutils.KeyInfo(key, core.Qt.KeyboardModifier.NoModifier)
match = keyparser.handle(info.to_event())
assert match == expected_match
assert hintmanager.keystr == keystr
- if key != Qt.Key.Key_C:
+ if key != core.Qt.Key.Key_C:
assert not commandrunner.commands
assert commandrunner.commands == [('message-info abc', None)]
diff --git a/tests/unit/mainwindow/statusbar/test_textbase.py b/tests/unit/mainwindow/statusbar/test_textbase.py
index 6bceb4bc4..145101264 100644
--- a/tests/unit/mainwindow/statusbar/test_textbase.py
+++ b/tests/unit/mainwindow/statusbar/test_textbase.py
@@ -19,17 +19,17 @@
"""Test TextBase widget."""
-from qutebrowser.qt.core import Qt
+from qutebrowser.qt import core
import pytest
from qutebrowser.mainwindow.statusbar.textbase import TextBase
@pytest.mark.parametrize('elidemode, check', [
- (Qt.TextElideMode.ElideRight, lambda s: s.endswith('…') or s.endswith('...')),
- (Qt.TextElideMode.ElideLeft, lambda s: s.startswith('…') or s.startswith('...')),
- (Qt.TextElideMode.ElideMiddle, lambda s: '…' in s or '...' in s),
- (Qt.TextElideMode.ElideNone, lambda s: '…' not in s and '...' not in s),
+ (core.Qt.TextElideMode.ElideRight, lambda s: s.endswith('…') or s.endswith('...')),
+ (core.Qt.TextElideMode.ElideLeft, lambda s: s.startswith('…') or s.startswith('...')),
+ (core.Qt.TextElideMode.ElideMiddle, lambda s: '…' in s or '...' in s),
+ (core.Qt.TextElideMode.ElideNone, lambda s: '…' not in s and '...' not in s),
])
def test_elided_text(fake_statusbar, qtbot, elidemode, check):
"""Ensure that a widget too small to hold the entire label text will elide.
diff --git a/tests/unit/mainwindow/statusbar/test_url.py b/tests/unit/mainwindow/statusbar/test_url.py
index 353c47a3c..a95609730 100644
--- a/tests/unit/mainwindow/statusbar/test_url.py
+++ b/tests/unit/mainwindow/statusbar/test_url.py
@@ -22,7 +22,7 @@
import pytest
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import core
from qutebrowser.utils import usertypes, urlutils, qtutils
from qutebrowser.mainwindow.statusbar import url
@@ -79,7 +79,7 @@ def test_set_url(url_widget, url_text, expected, which):
if url_text is None:
qurl = None
else:
- qurl = QUrl(url_text)
+ qurl = core.QUrl(url_text)
if not qurl.isValid():
# Special case for the invalid URL above
expected = "Invalid URL!"
@@ -105,28 +105,28 @@ def test_set_url(url_widget, url_text, expected, which):
])
def test_on_load_status_changed(url_widget, status, expected):
"""Test text when status is changed."""
- url_widget.set_url(QUrl('www.example.com'))
+ url_widget.set_url(core.QUrl('www.example.com'))
url_widget.on_load_status_changed(status)
assert url_widget._urltype == expected
@pytest.mark.parametrize('load_status, qurl', [
(usertypes.LoadStatus.success,
- QUrl('http://abc123.com/this/awesome/url.html')),
+ core.QUrl('http://abc123.com/this/awesome/url.html')),
(usertypes.LoadStatus.success,
- QUrl('http://reddit.com/r/linux')),
+ core.QUrl('http://reddit.com/r/linux')),
(usertypes.LoadStatus.success,
- QUrl('http://ä.com/')),
+ core.QUrl('http://ä.com/')),
(usertypes.LoadStatus.success_https,
- QUrl('www.google.com')),
+ core.QUrl('www.google.com')),
(usertypes.LoadStatus.success_https,
- QUrl('https://supersecret.gov/nsa/files.txt')),
+ core.QUrl('https://supersecret.gov/nsa/files.txt')),
(usertypes.LoadStatus.warn,
- QUrl('www.shadysite.org/some/file/with/issues.htm')),
+ core.QUrl('www.shadysite.org/some/file/with/issues.htm')),
(usertypes.LoadStatus.error,
- QUrl('invalid::/url')),
+ core.QUrl('invalid::/url')),
(usertypes.LoadStatus.error,
- QUrl()),
+ core.QUrl()),
])
def test_on_tab_changed(url_widget, fake_web_tab, load_status, qurl):
tab_widget = fake_web_tab(load_status=load_status, url=qurl)
@@ -142,22 +142,22 @@ def test_on_tab_changed(url_widget, fake_web_tab, load_status, qurl):
@pytest.mark.parametrize('qurl, load_status, expected_status', [
(
- QUrl('http://abc123.com/this/awesome/url.html'),
+ core.QUrl('http://abc123.com/this/awesome/url.html'),
usertypes.LoadStatus.success,
url.UrlType.success
),
(
- QUrl('https://supersecret.gov/nsa/files.txt'),
+ core.QUrl('https://supersecret.gov/nsa/files.txt'),
usertypes.LoadStatus.success_https,
url.UrlType.success_https
),
(
- QUrl('http://www.qutebrowser.org/CONTRIBUTING.html'),
+ core.QUrl('http://www.qutebrowser.org/CONTRIBUTING.html'),
usertypes.LoadStatus.loading,
url.UrlType.normal
),
(
- QUrl('www.whatisthisurl.com'),
+ core.QUrl('www.whatisthisurl.com'),
usertypes.LoadStatus.warn,
url.UrlType.warn
),
diff --git a/tests/unit/mainwindow/test_messageview.py b/tests/unit/mainwindow/test_messageview.py
index 5c3f14b2e..424f4380b 100644
--- a/tests/unit/mainwindow/test_messageview.py
+++ b/tests/unit/mainwindow/test_messageview.py
@@ -20,7 +20,7 @@
import contextlib
import pytest
-from qutebrowser.qt.core import Qt
+from qutebrowser.qt import core
from qutebrowser.mainwindow import messageview
from qutebrowser.utils import usertypes, message
@@ -84,9 +84,9 @@ def test_word_wrap(view, qtbot):
@pytest.mark.parametrize("rich, higher, expected_format", [
- (True, True, Qt.TextFormat.RichText),
- (False, False, Qt.TextFormat.PlainText),
- (None, False, Qt.TextFormat.PlainText),
+ (True, True, core.Qt.TextFormat.RichText),
+ (False, False, core.Qt.TextFormat.PlainText),
+ (None, False, core.Qt.TextFormat.PlainText),
])
@pytest.mark.parametrize("replace", ["test", None])
def test_rich_text(view, qtbot, rich, higher, expected_format, replace):
@@ -114,7 +114,7 @@ def test_rich_text(view, qtbot, rich, higher, expected_format, replace):
height1 = view.sizeHint().height()
assert height1 > 0
- assert view._messages[0].textFormat() == Qt.TextFormat.PlainText # default
+ assert view._messages[0].textFormat() == core.Qt.TextFormat.PlainText # default
view.show_message(info2)
assert len(view._messages) == 1
@@ -248,10 +248,10 @@ def test_replacing_geometry(qtbot, view):
@pytest.mark.parametrize('button, count', [
- (Qt.MouseButton.LeftButton, 0),
- (Qt.MouseButton.MiddleButton, 0),
- (Qt.MouseButton.RightButton, 0),
- (Qt.MouseButton.BackButton, 2),
+ (core.Qt.MouseButton.LeftButton, 0),
+ (core.Qt.MouseButton.MiddleButton, 0),
+ (core.Qt.MouseButton.RightButton, 0),
+ (core.Qt.MouseButton.BackButton, 2),
])
def test_click_messages(qtbot, view, button, count):
"""Messages should disappear when we click on them."""
diff --git a/tests/unit/mainwindow/test_prompt.py b/tests/unit/mainwindow/test_prompt.py
index 4dbe5a41a..4ffdcb0a3 100644
--- a/tests/unit/mainwindow/test_prompt.py
+++ b/tests/unit/mainwindow/test_prompt.py
@@ -20,7 +20,7 @@
import os
import pytest
-from qutebrowser.qt.core import Qt
+from qutebrowser.qt import core
from qutebrowser.mainwindow import prompt as promptmod
from qutebrowser.utils import usertypes
@@ -79,7 +79,7 @@ class TestFileCompletion:
# Deleting /f[oo/]
with qtbot.wait_signal(prompt._file_model.directoryLoaded):
for _ in range(3):
- qtbot.keyPress(prompt._lineedit, Qt.Key.Key_Backspace)
+ qtbot.keyPress(prompt._lineedit, core.Qt.Key.Key_Backspace)
# For some reason, this isn't always called when using qtbot.keyPress.
prompt._set_fileview_root(prompt._lineedit.text())
@@ -90,7 +90,7 @@ class TestFileCompletion:
# Deleting /[foo]
for _ in range(3):
- qtbot.keyPress(prompt._lineedit, Qt.Key.Key_Backspace)
+ qtbot.keyPress(prompt._lineedit, core.Qt.Key.Key_Backspace)
# We should now show / again, so tabbing twice gives us bar -> foo
prompt.item_focus('next')
@@ -99,8 +99,8 @@ class TestFileCompletion:
@pytest.mark.parametrize("keys, expected", [
([], ['bar', 'bat', 'foo']),
- ([Qt.Key.Key_F], ['foo']),
- ([Qt.Key.Key_A], ['bar', 'bat']),
+ ([core.Qt.Key.Key_F], ['foo']),
+ ([core.Qt.Key.Key_A], ['bar', 'bat']),
])
def test_filtering_path(self, qtbot, tmp_path, get_prompt, keys, expected):
testdir = tmp_path / 'test'
diff --git a/tests/unit/mainwindow/test_tabwidget.py b/tests/unit/mainwindow/test_tabwidget.py
index db300d7a6..545408c47 100644
--- a/tests/unit/mainwindow/test_tabwidget.py
+++ b/tests/unit/mainwindow/test_tabwidget.py
@@ -23,10 +23,10 @@
import functools
import pytest
-from qutebrowser.qt.gui import QIcon, QPixmap
from qutebrowser.mainwindow import tabwidget
from qutebrowser.utils import usertypes
+from qutebrowser.qt import gui
class TestTabWidget:
@@ -48,8 +48,8 @@ class TestTabWidget:
Regression test for #1015.
"""
# Size taken from issue report
- pixmap = QPixmap(72, 1)
- icon = QIcon(pixmap)
+ pixmap = gui.QPixmap(72, 1)
+ icon = gui.QIcon(pixmap)
tab = fake_web_tab()
widget.addTab(tab, icon, 'foobar')
diff --git a/tests/unit/misc/test_autoupdate.py b/tests/unit/misc/test_autoupdate.py
index 72b63b0c4..0bb214e1d 100644
--- a/tests/unit/misc/test_autoupdate.py
+++ b/tests/unit/misc/test_autoupdate.py
@@ -21,7 +21,7 @@
"""Tests for qutebrowser.misc.autoupdate."""
import pytest
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import core
from qutebrowser.misc import autoupdate, httpclient
@@ -68,7 +68,7 @@ def test_get_version_success(qtbot):
with qtbot.wait_signal(client.success):
client.get_version('test')
- assert http_stub.url == QUrl(client.API_URL.format('test'))
+ assert http_stub.url == core.QUrl(client.API_URL.format('test'))
def test_get_version_error(qtbot):
diff --git a/tests/unit/misc/test_editor.py b/tests/unit/misc/test_editor.py
index 628ee8545..1c04eaad9 100644
--- a/tests/unit/misc/test_editor.py
+++ b/tests/unit/misc/test_editor.py
@@ -26,7 +26,7 @@ import os
import logging
import pytest
-from qutebrowser.qt.core import QProcess
+from qutebrowser.qt import core
from qutebrowser.misc import editor as editormod
from qutebrowser.utils import usertypes
@@ -81,7 +81,7 @@ class TestFileHandling:
filename = pathlib.Path(editor._filename)
assert filename.exists()
assert filename.name.startswith('qutebrowser-editor-')
- editor._proc._proc.finished.emit(0, QProcess.ExitStatus.NormalExit)
+ editor._proc._proc.finished.emit(0, core.QProcess.ExitStatus.NormalExit)
assert filename.exists() != config_stub.val.editor.remove_file
@pytest.mark.parametrize('touch', [True, False])
@@ -92,7 +92,7 @@ class TestFileHandling:
path.touch()
editor.edit_file(str(path))
- editor._proc._proc.finished.emit(0, QProcess.ExitStatus.NormalExit)
+ editor._proc._proc.finished.emit(0, core.QProcess.ExitStatus.NormalExit)
assert path.exists()
@@ -103,7 +103,7 @@ class TestFileHandling:
assert filename.exists()
with caplog.at_level(logging.ERROR):
- editor._proc._proc.finished.emit(1, QProcess.ExitStatus.NormalExit)
+ editor._proc._proc.finished.emit(1, core.QProcess.ExitStatus.NormalExit)
assert filename.exists()
@@ -115,9 +115,9 @@ class TestFileHandling:
filename = pathlib.Path(editor._filename)
assert filename.exists()
- editor._proc.error.emit(QProcess.ProcessError.Crashed)
+ editor._proc.error.emit(core.QProcess.ProcessError.Crashed)
with caplog.at_level(logging.ERROR):
- editor._proc._proc.finished.emit(0, QProcess.ExitStatus.CrashExit)
+ editor._proc._proc.finished.emit(0, core.QProcess.ExitStatus.CrashExit)
assert filename.exists()
filename.unlink()
@@ -133,7 +133,7 @@ class TestFileHandling:
pytest.skip("File was still readable")
with caplog.at_level(logging.ERROR):
- editor._proc._proc.finished.emit(0, QProcess.ExitStatus.NormalExit)
+ editor._proc._proc.finished.emit(0, core.QProcess.ExitStatus.NormalExit)
assert not filename.exists()
msg = message_mock.getmsg(usertypes.MessageLevel.error)
assert msg.text.startswith("Failed to read back edited file: ")
@@ -181,7 +181,7 @@ class TestFileHandling:
fname = msg.text[len(prefix):]
with qtbot.wait_signal(editor.editing_finished):
- editor._proc._proc.finished.emit(0, QProcess.ExitStatus.NormalExit)
+ editor._proc._proc.finished.emit(0, core.QProcess.ExitStatus.NormalExit)
with open(fname, 'r', encoding='utf-8') as f:
assert f.read() == 'bar'
@@ -224,7 +224,7 @@ def test_modify(qtbot, editor, initial_text, edited_text):
f.write(edited_text)
with qtbot.wait_signal(editor.file_updated) as blocker:
- editor._proc._proc.finished.emit(0, QProcess.ExitStatus.NormalExit)
+ editor._proc._proc.finished.emit(0, core.QProcess.ExitStatus.NormalExit)
assert blocker.args == [edited_text]
@@ -258,7 +258,7 @@ def test_modify_watch(qtbot):
assert blocker.args == ['baz']
with qtbot.assert_not_emitted(editor.file_updated):
- editor._proc._proc.finished.emit(0, QProcess.ExitStatus.NormalExit)
+ editor._proc._proc.finished.emit(0, core.QProcess.ExitStatus.NormalExit)
def test_failing_watch(qtbot, caplog, monkeypatch):
@@ -276,7 +276,7 @@ def test_failing_watch(qtbot, caplog, monkeypatch):
_update_file(editor._filename, 'bar')
with qtbot.wait_signal(editor.file_updated) as blocker:
- editor._proc._proc.finished.emit(0, QProcess.ExitStatus.NormalExit)
+ editor._proc._proc.finished.emit(0, core.QProcess.ExitStatus.NormalExit)
assert blocker.args == ['bar']
message = 'Failed to watch path: {}'.format(editor._filename)
@@ -293,7 +293,7 @@ def test_failing_unwatch(qtbot, caplog, monkeypatch):
editor.edit('foo')
with caplog.at_level(logging.ERROR):
- editor._proc._proc.finished.emit(0, QProcess.ExitStatus.NormalExit)
+ editor._proc._proc.finished.emit(0, core.QProcess.ExitStatus.NormalExit)
message = 'Failed to unwatch paths: [{!r}]'.format(editor._filename)
assert caplog.messages[-1] == message
diff --git a/tests/unit/misc/test_guiprocess.py b/tests/unit/misc/test_guiprocess.py
index 702a1dca8..972dc744a 100644
--- a/tests/unit/misc/test_guiprocess.py
+++ b/tests/unit/misc/test_guiprocess.py
@@ -23,12 +23,11 @@ import sys
import logging
import pytest
-from qutebrowser.qt.core import QProcess, QUrl
from qutebrowser.misc import guiprocess
from qutebrowser.utils import usertypes, utils, version
from qutebrowser.api import cmdutils
-from qutebrowser.qt import sip
+from qutebrowser.qt import core, sip
@pytest.fixture
@@ -36,7 +35,7 @@ def proc(qtbot, caplog):
"""A fixture providing a GUIProcess and cleaning it up after the test."""
p = guiprocess.GUIProcess('testprocess')
yield p
- if not sip.isdeleted(p._proc) and p._proc.state() != QProcess.ProcessState.NotRunning:
+ if not sip.isdeleted(p._proc) and p._proc.state() != core.QProcess.ProcessState.NotRunning:
with caplog.at_level(logging.ERROR):
with qtbot.wait_signal(p.finished, timeout=10000,
raising=False) as blocker:
@@ -70,14 +69,14 @@ class TestProcessCommand:
monkeypatch.setitem(guiprocess.all_processes, 1234, fake_proc)
guiprocess.process(tab)
- assert tab.url() == QUrl('qute://process/1234')
+ assert tab.url() == core.QUrl('qute://process/1234')
def test_explicit_pid(self, tab, monkeypatch, fake_proc):
monkeypatch.setattr(guiprocess, 'last_pid', 1234)
monkeypatch.setitem(guiprocess.all_processes, 5678, fake_proc)
guiprocess.process(tab, 5678)
- assert tab.url() == QUrl('qute://process/5678')
+ assert tab.url() == core.QUrl('qute://process/5678')
def test_inexistent_pid(self, tab):
with pytest.raises(
@@ -126,7 +125,7 @@ def test_start(proc, qtbot, message_mock, py_proc):
assert not message_mock.messages
assert not proc.outcome.running
- assert proc.outcome.status == QProcess.ExitStatus.NormalExit
+ assert proc.outcome.status == core.QProcess.ExitStatus.NormalExit
assert proc.outcome.code == 0
assert str(proc.outcome) == 'Testprocess exited successfully.'
assert proc.outcome.state_str() == 'successful'
@@ -434,7 +433,7 @@ def test_exit_unsuccessful(qtbot, proc, message_mock, py_proc, caplog):
assert msg.text == expected
assert not proc.outcome.running
- assert proc.outcome.status == QProcess.ExitStatus.NormalExit
+ assert proc.outcome.status == core.QProcess.ExitStatus.NormalExit
assert proc.outcome.code == 1
assert str(proc.outcome) == 'Testprocess exited with status 1.'
assert proc.outcome.state_str() == 'unsuccessful'
@@ -454,7 +453,7 @@ def test_exit_crash(qtbot, proc, message_mock, py_proc, caplog):
assert msg.text == "Testprocess crashed. See :process for details."
assert not proc.outcome.running
- assert proc.outcome.status == QProcess.ExitStatus.CrashExit
+ assert proc.outcome.status == core.QProcess.ExitStatus.CrashExit
assert str(proc.outcome) == 'Testprocess crashed.'
assert proc.outcome.state_str() == 'crashed'
assert not proc.outcome.was_successful()
diff --git a/tests/unit/misc/test_ipc.py b/tests/unit/misc/test_ipc.py
index 9b6aa286c..a58920544 100644
--- a/tests/unit/misc/test_ipc.py
+++ b/tests/unit/misc/test_ipc.py
@@ -30,14 +30,13 @@ from unittest import mock
from typing import Optional, List
import pytest
-from qutebrowser.qt.core import pyqtSignal, QObject
-from qutebrowser.qt.network import QLocalServer, QLocalSocket, QAbstractSocket
-from qutebrowser.qt.test import QSignalSpy
+from qutebrowser.qt import test
import qutebrowser
from qutebrowser.misc import ipc
from qutebrowser.utils import standarddir, utils, version
from helpers import stubs, testutils
+from qutebrowser.qt import network, core
pytestmark = pytest.mark.usefixtures('qapp')
@@ -56,7 +55,7 @@ def ipc_server(qapp, qtbot):
server = ipc.IPCServer('qute-test')
yield server
if (server._socket is not None and
- server._socket.state() != QLocalSocket.LocalSocketState.UnconnectedState):
+ server._socket.state() != network.QLocalSocket.LocalSocketState.UnconnectedState):
with qtbot.wait_signal(server._socket.disconnected, raising=False):
server._socket.abort()
try:
@@ -67,7 +66,7 @@ def ipc_server(qapp, qtbot):
@pytest.fixture
def qlocalserver(qapp):
- server = QLocalServer()
+ server = network.QLocalServer()
yield server
server.close()
server.deleteLater()
@@ -75,10 +74,10 @@ def qlocalserver(qapp):
@pytest.fixture
def qlocalsocket(qapp):
- socket = QLocalSocket()
+ socket = network.QLocalSocket()
yield socket
socket.disconnectFromServer()
- if socket.state() != QLocalSocket.LocalSocketState.UnconnectedState:
+ if socket.state() != network.QLocalSocket.LocalSocketState.UnconnectedState:
socket.waitForDisconnected(1000)
@@ -89,7 +88,7 @@ def fake_runtime_dir(monkeypatch, short_tmpdir):
return short_tmpdir
-class FakeSocket(QObject):
+class FakeSocket(core.QObject):
"""A stub for a QLocalSocket.
@@ -100,11 +99,11 @@ class FakeSocket(QObject):
_connect_successful: The value returned for waitForConnected().
"""
- readyRead = pyqtSignal() # noqa: N815
- disconnected = pyqtSignal()
- errorOccurred = pyqtSignal(QLocalSocket.LocalSocketError) # noqa: N815
+ readyRead = core.pyqtSignal() # noqa: N815
+ disconnected = core.pyqtSignal()
+ errorOccurred = core.pyqtSignal(network.QLocalSocket.LocalSocketError) # noqa: N815
- def __init__(self, *, error=QLocalSocket.LocalSocketError.UnknownSocketError, state=None,
+ def __init__(self, *, error=network.QLocalSocket.LocalSocketError.UnknownSocketError, state=None,
data=None, connect_successful=True, parent=None):
super().__init__(parent)
self._error_val = error
@@ -270,7 +269,7 @@ class TestExceptions:
def test_listen_error(self, qlocalserver):
qlocalserver.listen(None)
exc = ipc.ListenError(qlocalserver)
- assert exc.code == QAbstractSocket.SocketError.HostNotFoundError
+ assert exc.code == network.QAbstractSocket.SocketError.HostNotFoundError
assert exc.message == "QLocalServer::listen: Name error"
msg = ("Error while listening to IPC server: QLocalServer::listen: "
"Name error (HostNotFoundError)")
@@ -280,9 +279,9 @@ class TestExceptions:
raise exc
def test_socket_error(self, qlocalserver):
- socket = FakeSocket(error=QLocalSocket.LocalSocketError.ConnectionRefusedError)
+ socket = FakeSocket(error=network.QLocalSocket.LocalSocketError.ConnectionRefusedError)
exc = ipc.SocketError("testing", socket)
- assert exc.code == QLocalSocket.LocalSocketError.ConnectionRefusedError
+ assert exc.code == network.QLocalSocket.LocalSocketError.ConnectionRefusedError
assert exc.message == "Error string"
assert str(exc) == "Error while testing: Error string (ConnectionRefusedError)"
@@ -322,7 +321,7 @@ class TestListen:
@pytest.mark.windows
def test_permissions_windows(self, ipc_server):
opts = ipc_server._server.socketOptions()
- assert opts == QLocalServer.SocketOption.UserAccessOption
+ assert opts == network.QLocalServer.SocketOption.UserAccessOption
@pytest.mark.posix
def test_permissions_posix(self, ipc_server):
@@ -403,24 +402,24 @@ class TestListen:
class TestOnError:
def test_closed(self, ipc_server):
- ipc_server._socket = QLocalSocket()
+ ipc_server._socket = network.QLocalSocket()
ipc_server._timer.timeout.disconnect()
ipc_server._timer.start()
- ipc_server.on_error(QLocalSocket.LocalSocketError.PeerClosedError)
+ ipc_server.on_error(network.QLocalSocket.LocalSocketError.PeerClosedError)
assert not ipc_server._timer.isActive()
def test_other_error(self, ipc_server, monkeypatch):
- socket = QLocalSocket()
+ socket = network.QLocalSocket()
ipc_server._socket = socket
monkeypatch.setattr(socket, 'error',
- lambda: QLocalSocket.LocalSocketError.ConnectionRefusedError)
+ lambda: network.QLocalSocket.LocalSocketError.ConnectionRefusedError)
monkeypatch.setattr(socket, 'errorString',
lambda: "Connection refused")
socket.setErrorString("Connection refused.")
with pytest.raises(ipc.Error, match=r"Error while handling IPC "
r"connection: Connection refused \(ConnectionRefusedError\)"):
- ipc_server.on_error(QLocalSocket.LocalSocketError.ConnectionRefusedError)
+ ipc_server.on_error(network.QLocalSocket.LocalSocketError.ConnectionRefusedError)
class TestHandleConnection:
@@ -444,13 +443,13 @@ class TestHandleConnection:
assert any(message.startswith(msg) for message in caplog.messages)
def test_disconnected_immediately(self, ipc_server, caplog):
- socket = FakeSocket(state=QLocalSocket.LocalSocketState.UnconnectedState)
+ socket = FakeSocket(state=network.QLocalSocket.LocalSocketState.UnconnectedState)
ipc_server._server = FakeServer(socket)
ipc_server.handle_connection()
assert "Socket was disconnected immediately." in caplog.messages
def test_error_immediately(self, ipc_server, caplog):
- socket = FakeSocket(error=QLocalSocket.LocalSocketError.ConnectionError)
+ socket = FakeSocket(error=network.QLocalSocket.LocalSocketError.ConnectionError)
ipc_server._server = FakeServer(socket)
with pytest.raises(ipc.Error, match=r"Error while handling IPC "
@@ -529,7 +528,7 @@ def test_invalid_data(qtbot, ipc_server, connected_socket, caplog, data, msg):
def test_multiline(qtbot, ipc_server, connected_socket):
- spy = QSignalSpy(ipc_server.got_args)
+ spy = test.QSignalSpy(ipc_server.got_args)
data = ('{{"args": ["one"], "target_arg": "tab",'
' "protocol_version": {version}}}\n'
@@ -589,7 +588,7 @@ class TestSendToRunningInstance:
assert parsed == raw_expected
def test_socket_error(self):
- socket = FakeSocket(error=QLocalSocket.LocalSocketError.ConnectionError)
+ socket = FakeSocket(error=network.QLocalSocket.LocalSocketError.ConnectionError)
with pytest.raises(ipc.Error, match=r"Error while writing to running "
r"instance: Error string \(ConnectionError\)"):
ipc.send_to_running_instance('qute-test', [], None, socket=socket)
@@ -599,7 +598,7 @@ class TestSendToRunningInstance:
ipc.send_to_running_instance('qute-test', [], None, socket=socket)
def test_socket_error_no_server(self):
- socket = FakeSocket(error=QLocalSocket.LocalSocketError.ConnectionError,
+ socket = FakeSocket(error=network.QLocalSocket.LocalSocketError.ConnectionError,
connect_successful=False)
with pytest.raises(ipc.Error, match=r"Error while connecting to "
r"running instance: Error string \(ConnectionError\)"):
@@ -658,7 +657,7 @@ class TestSendOrListen:
def qlocalserver_mock(self, mocker):
m = mocker.patch('qutebrowser.misc.ipc.QLocalServer', autospec=True)
m().errorString.return_value = "Error string"
- m.SocketOption = QLocalServer.SocketOption
+ m.SocketOption = network.QLocalServer.SocketOption
m().newConnection = stubs.FakeSignal()
return m
@@ -666,8 +665,8 @@ class TestSendOrListen:
def qlocalsocket_mock(self, mocker):
m = mocker.patch('qutebrowser.misc.ipc.QLocalSocket', autospec=True)
m().errorString.return_value = "Error string"
- m.LocalSocketError = QLocalSocket.LocalSocketError
- m.LocalSocketState = QLocalSocket.LocalSocketState
+ m.LocalSocketError = network.QLocalSocket.LocalSocketError
+ m.LocalSocketState = network.QLocalSocket.LocalSocketState
return m
@pytest.mark.linux(reason="Flaky on Windows and macOS")
@@ -701,14 +700,14 @@ class TestSendOrListen:
-> success
"""
qlocalserver_mock().listen.return_value = False
- err = QAbstractSocket.SocketError.AddressInUseError
+ err = network.QAbstractSocket.SocketError.AddressInUseError
qlocalserver_mock().serverError.return_value = err
qlocalsocket_mock().waitForConnected.side_effect = [False, True]
qlocalsocket_mock().error.side_effect = [
- QLocalSocket.LocalSocketError.ServerNotFoundError,
- QLocalSocket.LocalSocketError.UnknownSocketError,
- QLocalSocket.LocalSocketError.UnknownSocketError, # error() gets called twice
+ network.QLocalSocket.LocalSocketError.ServerNotFoundError,
+ network.QLocalSocket.LocalSocketError.UnknownSocketError,
+ network.QLocalSocket.LocalSocketError.UnknownSocketError, # error() gets called twice
]
ret = ipc.send_or_listen(args)
@@ -734,17 +733,17 @@ class TestSendOrListen:
-> not sent / error
"""
qlocalserver_mock().listen.return_value = False
- err = QAbstractSocket.SocketError.AddressInUseError
+ err = network.QAbstractSocket.SocketError.AddressInUseError
qlocalserver_mock().serverError.return_value = err
# If the second connection succeeds, we will have an error later.
# If it fails, that's the "not sent" case above.
qlocalsocket_mock().waitForConnected.side_effect = [False, has_error]
qlocalsocket_mock().error.side_effect = [
- QLocalSocket.LocalSocketError.ServerNotFoundError,
- QLocalSocket.LocalSocketError.ServerNotFoundError,
- QLocalSocket.LocalSocketError.ConnectionRefusedError,
- QLocalSocket.LocalSocketError.ConnectionRefusedError, # error() gets called twice
+ network.QLocalSocket.LocalSocketError.ServerNotFoundError,
+ network.QLocalSocket.LocalSocketError.ServerNotFoundError,
+ network.QLocalSocket.LocalSocketError.ConnectionRefusedError,
+ network.QLocalSocket.LocalSocketError.ConnectionRefusedError, # error() gets called twice
]
# For debug.qenum_key() on Qt 5
value_to_key = qlocalsocket_mock.staticMetaObject.enumerator().valueToKey
@@ -769,7 +768,7 @@ class TestSendOrListen:
def test_error_while_listening(self, qlocalserver_mock, caplog, args):
"""Test an error with the first listen call."""
qlocalserver_mock().listen.return_value = False
- err = QAbstractSocket.SocketError.SocketResourceError
+ err = network.QAbstractSocket.SocketError.SocketResourceError
qlocalserver_mock().serverError.return_value = err
with caplog.at_level(logging.ERROR):
@@ -812,7 +811,7 @@ def test_connect_inexistent(qlocalsocket):
would not work properly.
"""
qlocalsocket.connectToServer('qute-test-inexistent')
- assert qlocalsocket.error() == QLocalSocket.LocalSocketError.ServerNotFoundError
+ assert qlocalsocket.error() == network.QLocalSocket.LocalSocketError.ServerNotFoundError
@pytest.mark.posix
@@ -824,12 +823,12 @@ def test_socket_options_address_in_use_problem(qlocalserver, short_tmpdir):
"""
servername = str(short_tmpdir / 'x')
- s1 = QLocalServer()
+ s1 = network.QLocalServer()
ok = s1.listen(servername)
assert ok
- s2 = QLocalServer()
- s2.setSocketOptions(QLocalServer.SocketOption.UserAccessOption)
+ s2 = network.QLocalServer()
+ s2.setSocketOptions(network.QLocalServer.SocketOption.UserAccessOption)
ok = s2.listen(servername)
print(s2.errorString())
# We actually would expect ok == False here - but we want the test to fail
diff --git a/tests/unit/misc/test_miscwidgets.py b/tests/unit/misc/test_miscwidgets.py
index 8ec40008b..260c704ea 100644
--- a/tests/unit/misc/test_miscwidgets.py
+++ b/tests/unit/misc/test_miscwidgets.py
@@ -18,13 +18,12 @@
# along with qutebrowser. If not, see <https://www.gnu.org/licenses/>.
import logging
-
-from qutebrowser.qt.core import Qt, QSize
-from qutebrowser.qt.widgets import QWidget
+from qutebrowser.qt import widgets
import pytest
from qutebrowser.misc import miscwidgets
from qutebrowser.browser import inspector
+from qutebrowser.qt import core
class TestCommandLineEdit:
@@ -48,9 +47,9 @@ class TestCommandLineEdit:
cmd_edit.home(True)
assert cmd_edit.cursorPosition() == len(':')
- qtbot.keyClick(cmd_edit, Qt.Key.Key_Delete)
+ qtbot.keyClick(cmd_edit, core.Qt.Key.Key_Delete)
assert cmd_edit.text() == ':'
- qtbot.keyClick(cmd_edit, Qt.Key.Key_Backspace)
+ qtbot.keyClick(cmd_edit, core.Qt.Key.Key_Backspace)
assert cmd_edit.text() == ':'
qtbot.keyClicks(cmd_edit, 'hey again')
@@ -76,15 +75,15 @@ class TestCommandLineEdit:
assert cmd_edit.text() == ':hello'
assert cmd_edit.cursorPosition() == len(':hello')
for _ in ':hello':
- qtbot.keyClick(cmd_edit, Qt.Key.Key_Left, modifier=Qt.KeyboardModifier.ShiftModifier)
+ qtbot.keyClick(cmd_edit, core.Qt.Key.Key_Left, modifier=core.Qt.KeyboardModifier.ShiftModifier)
assert cmd_edit.cursorPosition() == len(':')
assert cmd_edit.selectionStart() == len(':')
-class WrappedWidget(QWidget):
+class WrappedWidget(widgets.QWidget):
def sizeHint(self):
- return QSize(23, 42)
+ return core.QSize(23, 42)
class TestWrapperLayout:
@@ -92,7 +91,7 @@ class TestWrapperLayout:
@pytest.fixture
def container(self, qtbot):
wrapped = WrappedWidget()
- parent = QWidget()
+ parent = widgets.QWidget()
qtbot.add_widget(wrapped)
qtbot.add_widget(parent)
layout = miscwidgets.WrapperLayout(parent)
@@ -101,7 +100,7 @@ class TestWrapperLayout:
return parent
def test_size_hint(self, container):
- assert container.sizeHint() == QSize(23, 42)
+ assert container.sizeHint() == core.QSize(23, 42)
def test_wrapped(self, container):
assert container.wrapped.parent() is container
@@ -178,10 +177,10 @@ class TestInspectorSplitter:
@pytest.mark.parametrize(
'position, orientation, inspector_idx, webview_idx', [
- (inspector.Position.left, Qt.Orientation.Horizontal, 0, 1),
- (inspector.Position.right, Qt.Orientation.Horizontal, 1, 0),
- (inspector.Position.top, Qt.Orientation.Vertical, 0, 1),
- (inspector.Position.bottom, Qt.Orientation.Vertical, 1, 0),
+ (inspector.Position.left, core.Qt.Orientation.Horizontal, 0, 1),
+ (inspector.Position.right, core.Qt.Orientation.Horizontal, 1, 0),
+ (inspector.Position.top, core.Qt.Orientation.Vertical, 0, 1),
+ (inspector.Position.bottom, core.Qt.Orientation.Vertical, 1, 0),
]
)
def test_set_inspector(self, position, orientation,
@@ -225,7 +224,7 @@ class TestInspectorSplitter:
state_config['inspector'] = {position.name: config}
splitter.resize(width, height)
- assert splitter.size() == QSize(width, height)
+ assert splitter.size() == core.QSize(width, height)
with caplog.at_level(logging.ERROR):
splitter.set_inspector(fake_inspector, position)
@@ -273,8 +272,8 @@ class TestInspectorSplitter:
new_window_size, exp_inspector_size,
position, splitter, fake_inspector, qtbot):
def resize(dim):
- size = (QSize(dim, 666) if splitter.orientation() == Qt.Orientation.Horizontal
- else QSize(666, dim))
+ size = (core.QSize(dim, 666) if splitter.orientation() == core.Qt.Orientation.Horizontal
+ else core.QSize(666, dim))
splitter.resize(size)
if splitter.size() != size:
pytest.skip("Resizing window failed")
diff --git a/tests/unit/misc/test_msgbox.py b/tests/unit/misc/test_msgbox.py
index 6eee28f32..bec9ef2ef 100644
--- a/tests/unit/misc/test_msgbox.py
+++ b/tests/unit/misc/test_msgbox.py
@@ -20,8 +20,7 @@
import pytest
-from qutebrowser.qt.core import Qt
-from qutebrowser.qt.widgets import QMessageBox, QWidget
+from qutebrowser.qt import widgets, core
from qutebrowser.misc import msgbox
from qutebrowser.utils import utils
@@ -36,10 +35,10 @@ def test_attributes(qtbot):
"""Test basic QMessageBox attributes."""
title = 'title'
text = 'text'
- parent = QWidget()
+ parent = widgets.QWidget()
qtbot.add_widget(parent)
- icon = QMessageBox.Icon.Critical
- buttons = QMessageBox.StandardButton.Ok | QMessageBox.StandardButton.Cancel
+ icon = widgets.QMessageBox.Icon.Critical
+ buttons = widgets.QMessageBox.StandardButton.Ok | widgets.QMessageBox.StandardButton.Cancel
box = msgbox.msgbox(parent=parent, title=title, text=text, icon=icon,
buttons=buttons)
@@ -53,13 +52,13 @@ def test_attributes(qtbot):
@pytest.mark.parametrize('plain_text, expected', [
- (True, Qt.TextFormat.PlainText),
- (False, Qt.TextFormat.RichText),
- (None, Qt.TextFormat.AutoText),
+ (True, core.Qt.TextFormat.PlainText),
+ (False, core.Qt.TextFormat.RichText),
+ (None, core.Qt.TextFormat.AutoText),
])
def test_plain_text(qtbot, plain_text, expected):
box = msgbox.msgbox(parent=None, title='foo', text='foo',
- icon=QMessageBox.Icon.Information, plain_text=plain_text)
+ icon=widgets.QMessageBox.Icon.Information, plain_text=plain_text)
qtbot.add_widget(box)
assert box.textFormat() == expected
@@ -73,7 +72,7 @@ def test_finished_signal(qtbot):
signal_triggered = True
box = msgbox.msgbox(parent=None, title='foo', text='foo',
- icon=QMessageBox.Icon.Information, on_finished=on_finished)
+ icon=widgets.QMessageBox.Icon.Information, on_finished=on_finished)
qtbot.add_widget(box)
@@ -89,7 +88,7 @@ def test_information(qtbot):
if not utils.is_mac:
assert box.windowTitle() == 'foo'
assert box.text() == 'bar'
- assert box.icon() == QMessageBox.Icon.Information
+ assert box.icon() == widgets.QMessageBox.Icon.Information
def test_no_err_windows(fake_args, caplog):
diff --git a/tests/unit/misc/test_pastebin.py b/tests/unit/misc/test_pastebin.py
index 906c4c3c6..c715ccce7 100644
--- a/tests/unit/misc/test_pastebin.py
+++ b/tests/unit/misc/test_pastebin.py
@@ -19,7 +19,7 @@
# along with qutebrowser. If not, see <https://www.gnu.org/licenses/>.
import pytest
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import core
from qutebrowser.misc import httpclient, pastebin
@@ -56,7 +56,7 @@ def test_paste_with_parent(data, pbclient):
http_stub = pbclient._client
pbclient.paste(data["name"], data["title"], data["text"], data["reply"])
assert http_stub.data == data
- assert http_stub.url == QUrl('https://crashes.qutebrowser.org/api/create')
+ assert http_stub.url == core.QUrl('https://crashes.qutebrowser.org/api/create')
@pytest.mark.parametrize('data', [
@@ -77,7 +77,7 @@ def test_paste_without_parent(data, pbclient):
http_stub = pbclient._client
pbclient.paste(data["name"], data["title"], data["text"])
assert pbclient._client.data == data
- assert http_stub.url == QUrl('https://crashes.qutebrowser.org/api/create')
+ assert http_stub.url == core.QUrl('https://crashes.qutebrowser.org/api/create')
def test_paste_private(pbclient):
@@ -91,7 +91,7 @@ def test_paste_private(pbclient):
http_stub = pbclient._client
pbclient.paste(data["name"], data["title"], data["text"], private=True)
assert pbclient._client.data == data
- assert http_stub.url == QUrl('https://crashes.qutebrowser.org/api/create')
+ assert http_stub.url == core.QUrl('https://crashes.qutebrowser.org/api/create')
@pytest.mark.parametrize('http', [
diff --git a/tests/unit/misc/test_sessions.py b/tests/unit/misc/test_sessions.py
index ad4c6e7c3..a3304d565 100644
--- a/tests/unit/misc/test_sessions.py
+++ b/tests/unit/misc/test_sessions.py
@@ -23,13 +23,13 @@ import logging
import pytest
import yaml
-from qutebrowser.qt.core import QUrl, QPoint, QByteArray, QObject
QWebView = pytest.importorskip('qutebrowser.qt.webkitwidgets').QWebView
from qutebrowser.misc import sessions
from qutebrowser.misc.sessions import TabHistoryItem as Item
from qutebrowser.utils import objreg, qtutils
from qutebrowser.browser.webkit import tabhistory
+from qutebrowser.qt import core
pytestmark = pytest.mark.qt_log_ignore('QIODevice::read.*: device not open')
@@ -123,7 +123,7 @@ class TestSaveTab:
assert not data['history']
-class FakeMainWindow(QObject):
+class FakeMainWindow(core.QObject):
"""Helper class for the fake_main_window fixture.
@@ -134,7 +134,7 @@ class FakeMainWindow(QObject):
def __init__(self, geometry, win_id, parent=None):
super().__init__(parent)
- self._geometry = QByteArray(geometry)
+ self._geometry = core.QByteArray(geometry)
self.win_id = win_id
def saveGeometry(self):
@@ -245,7 +245,7 @@ class TestSave:
def test_utf_8_invalid(self, tmp_path, sess_man, fake_history):
"""Make sure data containing invalid UTF8 raises SessionError."""
session_path = tmp_path / 'foo.yml'
- fake_history([Item(QUrl('http://www.qutebrowser.org/'), '\ud800',
+ fake_history([Item(core.QUrl('http://www.qutebrowser.org/'), '\ud800',
active=True)])
try:
@@ -308,7 +308,7 @@ class TestLoadTab:
@pytest.mark.parametrize('key, val, expected', [
('zoom', 1.23, 1.23),
- ('scroll-pos', {'x': 23, 'y': 42}, QPoint(23, 42)),
+ ('scroll-pos', {'x': 23, 'y': 42}, core.QPoint(23, 42)),
])
@pytest.mark.parametrize('in_main_data', [True, False])
def test_user_data(self, sess_man, fake_webview, key, val, expected,
@@ -335,17 +335,17 @@ class TestLoadTab:
item = {'url': url, 'title': 'foo'}
if original_url is None:
- expected = QUrl(url)
+ expected = core.QUrl(url)
else:
item['original-url'] = original_url
- expected = QUrl(original_url)
+ expected = core.QUrl(original_url)
d = {'history': [item]}
sess_man._load_tab(fake_webview, d)
assert len(fake_webview.loaded_history) == 1
loaded_item = fake_webview.loaded_history[0]
- assert loaded_item.url == QUrl(url)
+ assert loaded_item.url == core.QUrl(url)
assert loaded_item.original_url == expected
diff --git a/tests/unit/misc/test_sql.py b/tests/unit/misc/test_sql.py
index da72c5bb1..6b6a9f04c 100644
--- a/tests/unit/misc/test_sql.py
+++ b/tests/unit/misc/test_sql.py
@@ -23,9 +23,9 @@ import pytest
import hypothesis
from hypothesis import strategies
-from qutebrowser.qt.sql import QSqlDatabase, QSqlError, QSqlQuery
from qutebrowser.misc import sql
+from qutebrowser.qt import sql
pytestmark = pytest.mark.usefixtures('data_tmpdir')
@@ -95,13 +95,13 @@ class TestSqlError:
(sql.SqliteErrorCode.CONSTRAINT, sql.BugError),
])
def test_known(self, error_code, exception):
- sql_err = QSqlError("driver text", "db text", QSqlError.ErrorType.UnknownError,
+ sql_err = sql.QSqlError("driver text", "db text", sql.QSqlError.ErrorType.UnknownError,
error_code)
with pytest.raises(exception):
sql.raise_sqlite_error("Message", sql_err)
def test_logging(self, caplog):
- sql_err = QSqlError("driver text", "db text", QSqlError.ErrorType.UnknownError, '23')
+ sql_err = sql.QSqlError("driver text", "db text", sql.QSqlError.ErrorType.UnknownError, '23')
with pytest.raises(sql.BugError):
sql.raise_sqlite_error("Message", sql_err)
@@ -115,7 +115,7 @@ class TestSqlError:
@pytest.mark.parametrize('klass', [sql.KnownError, sql.BugError])
def test_text(self, klass):
- sql_err = QSqlError("driver text", "db text")
+ sql_err = sql.QSqlError("driver text", "db text")
err = klass("Message", sql_err)
assert err.text() == "db text"
@@ -391,10 +391,10 @@ class TestTransaction:
my_table.insert({'column': 1})
my_table.insert({'column': 2})
- db2 = QSqlDatabase.addDatabase('QSQLITE', 'db2')
+ db2 = sql.QSqlDatabase.addDatabase('QSQLITE', 'db2')
db2.setDatabaseName(database.qt_database().databaseName())
db2.open()
- query = QSqlQuery(db2)
+ query = sql.QSqlQuery(db2)
query.exec('select count(*) from my_table')
query.next()
assert query.record().value(0) == 0
diff --git a/tests/unit/misc/test_throttle.py b/tests/unit/misc/test_throttle.py
index e9d6267a1..0941a039e 100644
--- a/tests/unit/misc/test_throttle.py
+++ b/tests/unit/misc/test_throttle.py
@@ -21,9 +21,8 @@
from unittest import mock
-from qutebrowser.qt import sip
+from qutebrowser.qt import core, sip
import pytest
-from qutebrowser.qt.core import QObject
from helpers import testutils
from qutebrowser.misc import throttle
@@ -145,7 +144,7 @@ def test_set(func, qtbot):
def test_deleted_object(qtbot):
- class Obj(QObject):
+ class Obj(core.QObject):
def func(self):
self.setObjectName("test")
diff --git a/tests/unit/misc/test_utilcmds.py b/tests/unit/misc/test_utilcmds.py
index 2f3acc2f8..6f39bb31c 100644
--- a/tests/unit/misc/test_utilcmds.py
+++ b/tests/unit/misc/test_utilcmds.py
@@ -20,7 +20,7 @@
"""Tests for qutebrowser.misc.utilcmds."""
import pytest
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import core
from qutebrowser.misc import utilcmds
from qutebrowser.api import cmdutils
@@ -76,4 +76,4 @@ def tabbed_browser(stubs, win_registry):
def test_version(tabbed_browser, qapp):
utilcmds.version(win_id=0)
- assert tabbed_browser.loaded_url == QUrl('qute://version/')
+ assert tabbed_browser.loaded_url == core.QUrl('qute://version/')
diff --git a/tests/unit/test_app.py b/tests/unit/test_app.py
index a66f8451b..34f739e80 100644
--- a/tests/unit/test_app.py
+++ b/tests/unit/test_app.py
@@ -19,7 +19,7 @@
"""Tests for the qutebrowser.app module."""
-from qutebrowser.qt.core import QBuffer
+from qutebrowser.qt import core
from qutebrowser.misc import objects
from qutebrowser import app
@@ -33,7 +33,7 @@ def test_on_focus_changed_issue1484(monkeypatch, qapp, caplog):
"""
monkeypatch.setattr(objects, 'qapp', qapp)
- buf = QBuffer()
+ buf = core.QBuffer()
app.on_focus_changed(buf, buf)
expected = "on_focus_changed called with non-QWidget {!r}".format(buf)
diff --git a/tests/unit/utils/test_debug.py b/tests/unit/utils/test_debug.py
index 6d7135ecd..e81fbd15d 100644
--- a/tests/unit/utils/test_debug.py
+++ b/tests/unit/utils/test_debug.py
@@ -25,30 +25,29 @@ import time
import textwrap
import pytest
-from qutebrowser.qt.core import pyqtSignal, Qt, QEvent, QObject, QTimer
-from qutebrowser.qt.widgets import QStyle, QFrame, QSpinBox
from qutebrowser.utils import debug, qtutils
from qutebrowser.misc import objects
+from qutebrowser.qt import widgets, core
@debug.log_events
-class EventObject(QObject):
+class EventObject(core.QObject):
pass
def test_log_events(qapp, caplog):
obj = EventObject()
- qapp.sendEvent(obj, QEvent(QEvent.Type.User))
+ qapp.sendEvent(obj, core.QEvent(core.QEvent.Type.User))
qapp.processEvents()
assert caplog.messages == ['Event in test_debug.EventObject: User']
-class SignalObject(QObject):
+class SignalObject(core.QObject):
- signal1 = pyqtSignal()
- signal2 = pyqtSignal(str, str)
+ signal1 = core.pyqtSignal()
+ signal2 = core.pyqtSignal(str, str)
def __repr__(self):
"""This is not a nice thing to do, but it makes our tests easier."""
@@ -129,21 +128,21 @@ class TestQEnumKey:
If Qt/PyQt even changes and our tests wouldn't test the full
functionality of qenum_key because of that, this test will tell us.
"""
- assert not hasattr(QStyle.PrimitiveElement, 'staticMetaObject')
- assert hasattr(QFrame, 'staticMetaObject')
+ assert not hasattr(widgets.QStyle.PrimitiveElement, 'staticMetaObject')
+ assert hasattr(widgets.QFrame, 'staticMetaObject')
@pytest.mark.parametrize('base, value, klass, expected', [
- (QStyle, QStyle.PrimitiveElement.PE_PanelButtonCommand, None, 'PE_PanelButtonCommand'),
- (QFrame, QFrame.Shadow.Sunken, None, 'Sunken'),
- (QFrame, 0x0030, QFrame.Shadow, 'Sunken'),
- (QFrame, 0x1337, QFrame.Shadow, '0x1337'),
- (Qt, Qt.AnchorPoint.AnchorLeft, None, 'AnchorLeft'),
+ (widgets.QStyle, widgets.QStyle.PrimitiveElement.PE_PanelButtonCommand, None, 'PE_PanelButtonCommand'),
+ (widgets.QFrame, widgets.QFrame.Shadow.Sunken, None, 'Sunken'),
+ (widgets.QFrame, 0x0030, widgets.QFrame.Shadow, 'Sunken'),
+ (widgets.QFrame, 0x1337, widgets.QFrame.Shadow, '0x1337'),
+ (core.Qt, core.Qt.AnchorPoint.AnchorLeft, None, 'AnchorLeft'),
# No static meta object, passing in an int on Qt 6
- (QEvent, qtutils.extract_enum_val(QEvent.Type.User), QEvent.Type, 'User'),
+ (core.QEvent, qtutils.extract_enum_val(core.QEvent.Type.User), core.QEvent.Type, 'User'),
# Unknown value with IntFlags
- (Qt, Qt.AlignmentFlag(1024), None, '0x0400'),
+ (core.Qt, core.Qt.AlignmentFlag(1024), None, '0x0400'),
])
def test_qenum_key(self, base, value, klass, expected):
key = debug.qenum_key(base, value, klass=klass)
@@ -152,7 +151,7 @@ class TestQEnumKey:
def test_int_noklass(self):
"""Test passing an int without explicit klass given."""
with pytest.raises(TypeError):
- debug.qenum_key(QFrame, 42)
+ debug.qenum_key(widgets.QFrame, 42)
class TestQFlagsKey:
@@ -163,19 +162,19 @@ class TestQFlagsKey:
"""
@pytest.mark.parametrize('base, value, klass, expected', [
- (Qt, Qt.AlignmentFlag.AlignTop, None, 'AlignTop'),
- pytest.param(Qt, Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignTop, None,
+ (core.Qt, core.Qt.AlignmentFlag.AlignTop, None, 'AlignTop'),
+ pytest.param(core.Qt, core.Qt.AlignmentFlag.AlignLeft | core.Qt.AlignmentFlag.AlignTop, None,
'AlignLeft|AlignTop', marks=pytest.mark.qt5_xfail(raises=AssertionError)),
- (Qt, Qt.AlignmentFlag.AlignCenter, None, 'AlignHCenter|AlignVCenter'),
- pytest.param(Qt, 0x0021, Qt.AlignmentFlag, 'AlignLeft|AlignTop',
+ (core.Qt, core.Qt.AlignmentFlag.AlignCenter, None, 'AlignHCenter|AlignVCenter'),
+ pytest.param(core.Qt, 0x0021, core.Qt.AlignmentFlag, 'AlignLeft|AlignTop',
marks=pytest.mark.qt5_xfail(raises=AssertionError)),
- (Qt, 0x1100, Qt.AlignmentFlag, 'AlignBaseline|0x1000'),
- (Qt, Qt.DockWidgetArea(0), Qt.DockWidgetArea, 'NoDockWidgetArea'),
- (Qt, Qt.DockWidgetArea(0), None, 'NoDockWidgetArea'),
- (Qt, Qt.KeyboardModifier.ShiftModifier, Qt.KeyboardModifier, 'ShiftModifier'),
- (Qt, Qt.KeyboardModifier.ShiftModifier, None, 'ShiftModifier'),
- (Qt, Qt.KeyboardModifier.ShiftModifier | Qt.KeyboardModifier.ControlModifier, Qt.KeyboardModifier, 'ShiftModifier|ControlModifier'),
- pytest.param(Qt, Qt.KeyboardModifier.ShiftModifier | Qt.KeyboardModifier.ControlModifier, None, 'ShiftModifier|ControlModifier', marks=pytest.mark.qt5_xfail(raises=AssertionError)),
+ (core.Qt, 0x1100, core.Qt.AlignmentFlag, 'AlignBaseline|0x1000'),
+ (core.Qt, core.Qt.DockWidgetArea(0), core.Qt.DockWidgetArea, 'NoDockWidgetArea'),
+ (core.Qt, core.Qt.DockWidgetArea(0), None, 'NoDockWidgetArea'),
+ (core.Qt, core.Qt.KeyboardModifier.ShiftModifier, core.Qt.KeyboardModifier, 'ShiftModifier'),
+ (core.Qt, core.Qt.KeyboardModifier.ShiftModifier, None, 'ShiftModifier'),
+ (core.Qt, core.Qt.KeyboardModifier.ShiftModifier | core.Qt.KeyboardModifier.ControlModifier, core.Qt.KeyboardModifier, 'ShiftModifier|ControlModifier'),
+ pytest.param(core.Qt, core.Qt.KeyboardModifier.ShiftModifier | core.Qt.KeyboardModifier.ControlModifier, None, 'ShiftModifier|ControlModifier', marks=pytest.mark.qt5_xfail(raises=AssertionError)),
])
def test_qflags_key(self, base, value, klass, expected):
flags = debug.qflags_key(base, value, klass=klass)
@@ -204,14 +203,14 @@ class TestQFlagsKey:
def test_int_noklass(self):
"""Test passing an int without explicit klass given."""
with pytest.raises(TypeError):
- debug.qflags_key(Qt, 42)
+ debug.qflags_key(core.Qt, 42)
@pytest.mark.parametrize('cls, signal', [
(SignalObject, 'signal1'),
(SignalObject, 'signal2'),
- (QTimer, 'timeout'),
- (QSpinBox, 'valueChanged'), # Overloaded signal
+ (core.QTimer, 'timeout'),
+ (widgets.QSpinBox, 'valueChanged'), # Overloaded signal
])
@pytest.mark.parametrize('bound', [True, False])
def test_signal_name(cls, signal, bound):
@@ -258,7 +257,7 @@ def test_dbg_signal(stubs, args, expected):
class TestGetAllObjects:
- class Object(QObject):
+ class Object(core.QObject):
def __init__(self, name, parent=None):
self._name = name
@@ -273,7 +272,7 @@ class TestGetAllObjects:
app = stubs.FakeQApplication(all_widgets=widgets)
monkeypatch.setattr(objects, 'qapp', app)
- root = QObject()
+ root = core.QObject()
o1 = self.Object('Object 1', root)
o2 = self.Object('Object 2', o1) # noqa: F841
o3 = self.Object('Object 3', root) # noqa: F841
diff --git a/tests/unit/utils/test_error.py b/tests/unit/utils/test_error.py
index 576a048de..9c83bdaab 100644
--- a/tests/unit/utils/test_error.py
+++ b/tests/unit/utils/test_error.py
@@ -21,8 +21,7 @@
import logging
import pytest
-from qutebrowser.qt.core import QTimer
-from qutebrowser.qt.widgets import QMessageBox
+from qutebrowser.qt import widgets, core
from qutebrowser.utils import error, utils
from qutebrowser.misc import ipc
@@ -82,13 +81,13 @@ def test_err_windows(qtbot, qapp, pre_text, post_text, expected, caplog):
qtbot.add_widget(w)
if not utils.is_mac:
assert w.windowTitle() == 'title'
- assert w.icon() == QMessageBox.Icon.Critical
- assert w.standardButtons() == QMessageBox.StandardButton.Ok
+ assert w.icon() == widgets.QMessageBox.Icon.Critical
+ assert w.standardButtons() == widgets.QMessageBox.StandardButton.Ok
assert w.text() == expected
finally:
w.close()
- QTimer.singleShot(10, err_window_check)
+ core.QTimer.singleShot(10, err_window_check)
with caplog.at_level(logging.ERROR):
error.handle_fatal_exc(ValueError("exception"), 'title',
diff --git a/tests/unit/utils/test_jinja.py b/tests/unit/utils/test_jinja.py
index 28ff09525..fa2cb9d34 100644
--- a/tests/unit/utils/test_jinja.py
+++ b/tests/unit/utils/test_jinja.py
@@ -24,7 +24,7 @@ import logging
import jinja2.exceptions
import pytest
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import core
from qutebrowser.utils import jinja
from qutebrowser.config import configexc
@@ -70,7 +70,7 @@ def test_resource_url():
"""Test resource_url() which can be used from templates."""
data = jinja.render('test2.html')
print(data)
- url = QUrl(data)
+ url = core.QUrl(data)
assert url.isValid()
assert url.toDisplayString() == 'qute://resource/utils/testfile'
@@ -79,7 +79,7 @@ def test_data_url():
"""Test data_url() which can be used from templates."""
data = jinja.render('test3.html')
print(data)
- url = QUrl(data)
+ url = core.QUrl(data)
assert url.isValid()
assert data == 'data:text/plain;base64,Zm9v' # 'foo'
diff --git a/tests/unit/utils/test_log.py b/tests/unit/utils/test_log.py
index 921d354d1..9d2f5cc5b 100644
--- a/tests/unit/utils/test_log.py
+++ b/tests/unit/utils/test_log.py
@@ -28,7 +28,7 @@ import dataclasses
import pytest
import _pytest.logging # pylint: disable=import-private-name
-from qutebrowser.qt import core as qtcore
+from qutebrowser.qt import core
from qutebrowser import qutebrowser
from qutebrowser.utils import log
@@ -429,5 +429,5 @@ class TestQtMessageHandler:
def test_empty_message(self, caplog):
"""Make sure there's no crash with an empty message."""
- log.qt_message_handler(qtcore.QtMsgType.QtDebugMsg, self.Context(), "")
+ log.qt_message_handler(core.QtMsgType.QtDebugMsg, self.Context(), "")
assert caplog.messages == ["Logged empty message!"]
diff --git a/tests/unit/utils/test_qtutils.py b/tests/unit/utils/test_qtutils.py
index 6ae495826..5cd978d43 100644
--- a/tests/unit/utils/test_qtutils.py
+++ b/tests/unit/utils/test_qtutils.py
@@ -28,13 +28,12 @@ import unittest
import unittest.mock
import pytest
-from qutebrowser.qt.core import (QDataStream, QPoint, QUrl, QByteArray, QIODevice,
- QTimer, QBuffer, QFile, QProcess, QFileDevice, QLibraryInfo, Qt)
-from qutebrowser.qt.gui import QColor
+from qutebrowser.qt import gui
from qutebrowser.utils import qtutils, utils, usertypes
import overflow_test_cases
from helpers import testutils
+from qutebrowser.qt import core
if utils.is_linux:
# Those are not run on macOS because that seems to cause a hang sometimes.
@@ -205,12 +204,12 @@ def test_ensure_valid(obj, raising, exc_reason, exc_str):
@pytest.mark.parametrize('status, raising, message', [
- (QDataStream.Status.Ok, False, None),
- (QDataStream.Status.ReadPastEnd, True,
+ (core.QDataStream.Status.Ok, False, None),
+ (core.QDataStream.Status.ReadPastEnd, True,
"The data stream has read past the end of the data in the underlying device."),
- (QDataStream.Status.ReadCorruptData, True,
+ (core.QDataStream.Status.ReadCorruptData, True,
"The data stream has read corrupt data."),
- (QDataStream.Status.WriteFailed, True,
+ (core.QDataStream.Status.WriteFailed, True,
"The data stream cannot write to the underlying device."),
])
def test_check_qdatastream(status, raising, message):
@@ -221,7 +220,7 @@ def test_check_qdatastream(status, raising, message):
raising: Whether check_qdatastream is expected to raise OSError.
message: The expected exception string.
"""
- stream = QDataStream()
+ stream = core.QDataStream()
stream.setStatus(status)
if raising:
with pytest.raises(OSError, match=message):
@@ -232,14 +231,14 @@ def test_check_qdatastream(status, raising, message):
def test_qdatastream_status_count():
"""Make sure no new members are added to QDataStream.Status."""
- status_vals = testutils.enum_members(QDataStream, QDataStream.Status)
+ status_vals = testutils.enum_members(core.QDataStream, core.QDataStream.Status)
assert len(status_vals) == 4
@pytest.mark.parametrize('color, expected', [
- (QColor('red'), 'rgba(255, 0, 0, 255)'),
- (QColor('blue'), 'rgba(0, 0, 255, 255)'),
- (QColor(1, 3, 5, 7), 'rgba(1, 3, 5, 7)'),
+ (gui.QColor('red'), 'rgba(255, 0, 0, 255)'),
+ (gui.QColor('blue'), 'rgba(0, 0, 255, 255)'),
+ (gui.QColor(1, 3, 5, 7), 'rgba(1, 3, 5, 7)'),
])
def test_qcolor_to_qsscolor(color, expected):
assert qtutils.qcolor_to_qsscolor(color) == expected
@@ -247,12 +246,12 @@ def test_qcolor_to_qsscolor(color, expected):
def test_qcolor_to_qsscolor_invalid():
with pytest.raises(qtutils.QtValueError):
- qtutils.qcolor_to_qsscolor(QColor())
+ qtutils.qcolor_to_qsscolor(gui.QColor())
@pytest.mark.parametrize('obj', [
- QPoint(23, 42),
- QUrl('http://www.qutebrowser.org/'),
+ core.QPoint(23, 42),
+ core.QUrl('http://www.qutebrowser.org/'),
])
def test_serialize(obj):
"""Test a serialize/deserialize round trip.
@@ -276,25 +275,25 @@ class TestSerializeStream:
@pytest.fixture
def stream_mock(self):
"""Fixture providing a QDataStream-like mock."""
- m = unittest.mock.MagicMock(spec=QDataStream)
- m.status.return_value = QDataStream.Status.Ok
+ m = unittest.mock.MagicMock(spec=core.QDataStream)
+ m.status.return_value = core.QDataStream.Status.Ok
return m
def test_serialize_pre_error_mock(self, stream_mock):
"""Test serialize_stream with an error already set."""
- stream_mock.status.return_value = QDataStream.Status.ReadCorruptData
+ stream_mock.status.return_value = core.QDataStream.Status.ReadCorruptData
with pytest.raises(OSError, match="The data stream has read corrupt "
"data."):
- qtutils.serialize_stream(stream_mock, QPoint())
+ qtutils.serialize_stream(stream_mock, core.QPoint())
assert not stream_mock.__lshift__.called
def test_serialize_post_error_mock(self, stream_mock):
"""Test serialize_stream with an error while serializing."""
- obj = QPoint()
+ obj = core.QPoint()
stream_mock.__lshift__.side_effect = lambda _other: self._set_status(
- stream_mock, QDataStream.Status.ReadCorruptData)
+ stream_mock, core.QDataStream.Status.ReadCorruptData)
with pytest.raises(OSError, match="The data stream has read corrupt "
"data."):
@@ -304,19 +303,19 @@ class TestSerializeStream:
def test_deserialize_pre_error_mock(self, stream_mock):
"""Test deserialize_stream with an error already set."""
- stream_mock.status.return_value = QDataStream.Status.ReadCorruptData
+ stream_mock.status.return_value = core.QDataStream.Status.ReadCorruptData
with pytest.raises(OSError, match="The data stream has read corrupt "
"data."):
- qtutils.deserialize_stream(stream_mock, QPoint())
+ qtutils.deserialize_stream(stream_mock, core.QPoint())
assert not stream_mock.__rshift__.called
def test_deserialize_post_error_mock(self, stream_mock):
"""Test deserialize_stream with an error while deserializing."""
- obj = QPoint()
+ obj = core.QPoint()
stream_mock.__rshift__.side_effect = lambda _other: self._set_status(
- stream_mock, QDataStream.Status.ReadCorruptData)
+ stream_mock, core.QDataStream.Status.ReadCorruptData)
with pytest.raises(OSError, match="The data stream has read corrupt "
"data."):
@@ -326,14 +325,14 @@ class TestSerializeStream:
def test_round_trip_real_stream(self):
"""Test a round trip with a real QDataStream."""
- src_obj = QPoint(23, 42)
- dest_obj = QPoint()
- data = QByteArray()
+ src_obj = core.QPoint(23, 42)
+ dest_obj = core.QPoint()
+ data = core.QByteArray()
- write_stream = QDataStream(data, QIODevice.OpenModeFlag.WriteOnly)
+ write_stream = core.QDataStream(data, core.QIODevice.OpenModeFlag.WriteOnly)
qtutils.serialize_stream(write_stream, src_obj)
- read_stream = QDataStream(data, QIODevice.OpenModeFlag.ReadOnly)
+ read_stream = core.QDataStream(data, core.QIODevice.OpenModeFlag.ReadOnly)
qtutils.deserialize_stream(read_stream, dest_obj)
assert src_obj == dest_obj
@@ -341,18 +340,18 @@ class TestSerializeStream:
@pytest.mark.qt_log_ignore('^QIODevice::write.*: ReadOnly device')
def test_serialize_readonly_stream(self):
"""Test serialize_stream with a read-only stream."""
- data = QByteArray()
- stream = QDataStream(data, QIODevice.OpenModeFlag.ReadOnly)
+ data = core.QByteArray()
+ stream = core.QDataStream(data, core.QIODevice.OpenModeFlag.ReadOnly)
with pytest.raises(OSError, match="The data stream cannot write to "
"the underlying device."):
- qtutils.serialize_stream(stream, QPoint())
+ qtutils.serialize_stream(stream, core.QPoint())
@pytest.mark.qt_log_ignore('QIODevice::read.*: WriteOnly device')
def test_deserialize_writeonly_stream(self):
"""Test deserialize_stream with a write-only stream."""
- data = QByteArray()
- obj = QPoint()
- stream = QDataStream(data, QIODevice.OpenModeFlag.WriteOnly)
+ data = core.QByteArray()
+ obj = core.QPoint()
+ stream = core.QDataStream(data, core.QIODevice.OpenModeFlag.WriteOnly)
with pytest.raises(OSError, match="The data stream has read past the "
"end of the data in the underlying device."):
qtutils.deserialize_stream(stream, obj)
@@ -387,7 +386,7 @@ class TestSavefileOpen:
with qtutils.savefile_open('filename'):
pass
- qsavefile_mock.open.assert_called_once_with(QIODevice.OpenModeFlag.WriteOnly)
+ qsavefile_mock.open.assert_called_once_with(core.QIODevice.OpenModeFlag.WriteOnly)
qsavefile_mock.cancelWriting.assert_called_once_with()
def test_mock_exception(self, qsavefile_mock):
@@ -398,7 +397,7 @@ class TestSavefileOpen:
with qtutils.savefile_open('filename'):
raise SavefileTestException
- qsavefile_mock.open.assert_called_once_with(QIODevice.OpenModeFlag.WriteOnly)
+ qsavefile_mock.open.assert_called_once_with(core.QIODevice.OpenModeFlag.WriteOnly)
qsavefile_mock.cancelWriting.assert_called_once_with()
def test_mock_commit_failed(self, qsavefile_mock):
@@ -410,7 +409,7 @@ class TestSavefileOpen:
with qtutils.savefile_open('filename'):
pass
- qsavefile_mock.open.assert_called_once_with(QIODevice.OpenModeFlag.WriteOnly)
+ qsavefile_mock.open.assert_called_once_with(core.QIODevice.OpenModeFlag.WriteOnly)
assert not qsavefile_mock.cancelWriting.called
assert not qsavefile_mock.errorString.called
@@ -425,7 +424,7 @@ class TestSavefileOpen:
with qtutils.savefile_open('filename') as f:
f.write("Hello World")
- qsavefile_mock.open.assert_called_once_with(QIODevice.OpenModeFlag.WriteOnly)
+ qsavefile_mock.open.assert_called_once_with(core.QIODevice.OpenModeFlag.WriteOnly)
assert not qsavefile_mock.cancelWriting.called
qsavefile_mock.write.assert_called_once_with(b"Hello World")
@@ -532,22 +531,22 @@ if test_file is not None:
def setUp(self):
"""Set up self.f using a PyQIODevice instead of a real file."""
- self._data = QByteArray()
+ self._data = core.QByteArray()
self.f = self.open(test_file.TESTFN, 'wb')
def open(self, _fname, mode):
"""Open an in-memory PyQIODevice instead of a real file."""
modes = {
- 'wb': QIODevice.OpenModeFlag.WriteOnly | QIODevice.OpenModeFlag.Truncate,
- 'w': QIODevice.OpenModeFlag.WriteOnly | QIODevice.OpenModeFlag.Text | QIODevice.OpenModeFlag.Truncate,
- 'rb': QIODevice.OpenModeFlag.ReadOnly,
- 'r': QIODevice.OpenModeFlag.ReadOnly | QIODevice.OpenModeFlag.Text,
+ 'wb': core.QIODevice.OpenModeFlag.WriteOnly | core.QIODevice.OpenModeFlag.Truncate,
+ 'w': core.QIODevice.OpenModeFlag.WriteOnly | core.QIODevice.OpenModeFlag.Text | core.QIODevice.OpenModeFlag.Truncate,
+ 'rb': core.QIODevice.OpenModeFlag.ReadOnly,
+ 'r': core.QIODevice.OpenModeFlag.ReadOnly | core.QIODevice.OpenModeFlag.Text,
}
try:
qt_mode = modes[mode]
except KeyError:
raise ValueError("Invalid mode {}!".format(mode))
- f = QBuffer(self._data)
+ f = core.QBuffer(self._data)
f.open(qt_mode)
qiodev = qtutils.PyQIODevice(f)
# Make sure tests using name/mode don't blow up.
@@ -579,7 +578,7 @@ if test_file is not None:
"""Skip this test truncating is unsupported."""
-class FailingQIODevice(QIODevice):
+class FailingQIODevice(core.QIODevice):
"""A fake QIODevice where reads/writes fail."""
@@ -616,8 +615,8 @@ class TestPyQIODevice:
@pytest.fixture
def pyqiodev(self):
"""Fixture providing a PyQIODevice with a QByteArray to test."""
- data = QByteArray()
- f = QBuffer(data)
+ data = core.QByteArray()
+ f = core.QBuffer(data)
qiodev = qtutils.PyQIODevice(f)
yield qiodev
qiodev.close()
@@ -655,14 +654,14 @@ class TestPyQIODevice:
Args:
method: The name of the method to call.
"""
- pyqiodev.open(QIODevice.OpenModeFlag.WriteOnly)
+ pyqiodev.open(core.QIODevice.OpenModeFlag.WriteOnly)
func = getattr(pyqiodev, method)
with pytest.raises(OSError, match="Trying to read unreadable file!"):
func()
def test_unwritable(self, pyqiodev):
"""Test writing with a read-only device."""
- pyqiodev.open(QIODevice.OpenModeFlag.ReadOnly)
+ pyqiodev.open(core.QIODevice.OpenModeFlag.ReadOnly)
with pytest.raises(OSError, match="Trying to write to unwritable "
"file!"):
pyqiodev.write(b'')
@@ -675,17 +674,17 @@ class TestPyQIODevice:
data: The data to write before checking if the length equals
len(data).
"""
- pyqiodev.open(QIODevice.OpenModeFlag.WriteOnly)
+ pyqiodev.open(core.QIODevice.OpenModeFlag.WriteOnly)
pyqiodev.write(data)
assert len(pyqiodev) == len(data)
def test_failing_open(self, tmp_path):
"""Test open() which fails (because it's an existent directory)."""
- qf = QFile(str(tmp_path))
+ qf = core.QFile(str(tmp_path))
dev = qtutils.PyQIODevice(qf)
with pytest.raises(qtutils.QtOSError) as excinfo:
- dev.open(QIODevice.OpenModeFlag.WriteOnly)
- assert excinfo.value.qt_errno == QFileDevice.FileError.OpenError
+ dev.open(core.QIODevice.OpenModeFlag.WriteOnly)
+ assert excinfo.value.qt_errno == core.QFileDevice.FileError.OpenError
assert dev.closed
def test_fileno(self, pyqiodev):
@@ -714,9 +713,9 @@ class TestPyQIODevice:
data: The expected data to read after seeking.
raising: Whether seeking should raise OSError.
"""
- with pyqiodev.open(QIODevice.OpenModeFlag.WriteOnly) as f:
+ with pyqiodev.open(core.QIODevice.OpenModeFlag.WriteOnly) as f:
f.write(b'1234567890')
- pyqiodev.open(QIODevice.OpenModeFlag.ReadOnly)
+ pyqiodev.open(core.QIODevice.OpenModeFlag.ReadOnly)
if raising:
with pytest.raises(OSError, match="seek failed!"):
pyqiodev.seek(offset, whence)
@@ -735,7 +734,7 @@ class TestPyQIODevice:
# pylint: enable=no-member,useless-suppression
else:
pytest.skip("Needs os.SEEK_HOLE or os.SEEK_DATA available.")
- pyqiodev.open(QIODevice.OpenModeFlag.ReadOnly)
+ pyqiodev.open(core.QIODevice.OpenModeFlag.ReadOnly)
with pytest.raises(io.UnsupportedOperation):
pyqiodev.seek(0, whence)
@@ -745,7 +744,7 @@ class TestPyQIODevice:
This also verifies seek() and tell() behave as expected.
"""
- proc = QProcess()
+ proc = core.QProcess()
proc.start(*py_proc('print("Hello World")'))
dev = qtutils.PyQIODevice(proc)
assert not dev.closed
@@ -764,7 +763,7 @@ class TestPyQIODevice:
def test_closed(self, pyqiodev):
"""Test the closed attribute."""
assert pyqiodev.closed
- pyqiodev.open(QIODevice.OpenModeFlag.ReadOnly)
+ pyqiodev.open(core.QIODevice.OpenModeFlag.ReadOnly)
assert not pyqiodev.closed
pyqiodev.close()
assert pyqiodev.closed
@@ -772,14 +771,14 @@ class TestPyQIODevice:
def test_contextmanager(self, pyqiodev):
"""Make sure using the PyQIODevice as context manager works."""
assert pyqiodev.closed
- with pyqiodev.open(QIODevice.OpenModeFlag.ReadOnly) as f:
+ with pyqiodev.open(core.QIODevice.OpenModeFlag.ReadOnly) as f:
assert not f.closed
assert f is pyqiodev
assert pyqiodev.closed
def test_flush(self, pyqiodev):
"""Make sure flushing doesn't raise an exception."""
- pyqiodev.open(QIODevice.OpenModeFlag.WriteOnly)
+ pyqiodev.open(core.QIODevice.OpenModeFlag.WriteOnly)
pyqiodev.write(b'test')
pyqiodev.flush()
@@ -794,14 +793,14 @@ class TestPyQIODevice:
method: The name of the method to call.
ret: The return value we expect.
"""
- pyqiodev.open(QIODevice.OpenModeFlag.WriteOnly)
+ pyqiodev.open(core.QIODevice.OpenModeFlag.WriteOnly)
func = getattr(pyqiodev, method)
assert func() == ret
@pytest.mark.parametrize('mode, readable, writable', [
- (QIODevice.OpenModeFlag.ReadOnly, True, False),
- (QIODevice.OpenModeFlag.ReadWrite, True, True),
- (QIODevice.OpenModeFlag.WriteOnly, False, True),
+ (core.QIODevice.OpenModeFlag.ReadOnly, True, False),
+ (core.QIODevice.OpenModeFlag.ReadWrite, True, True),
+ (core.QIODevice.OpenModeFlag.WriteOnly, False, True),
])
def test_readable_writable(self, mode, readable, writable, pyqiodev):
"""Test readable() and writable().
@@ -830,19 +829,19 @@ class TestPyQIODevice:
size: The size to pass to readline()
chunks: A list of expected chunks to read.
"""
- with pyqiodev.open(QIODevice.OpenModeFlag.WriteOnly) as f:
+ with pyqiodev.open(core.QIODevice.OpenModeFlag.WriteOnly) as f:
f.write(b'one\ntwo\nthree')
- pyqiodev.open(QIODevice.OpenModeFlag.ReadOnly)
+ pyqiodev.open(core.QIODevice.OpenModeFlag.ReadOnly)
for i, chunk in enumerate(chunks, start=1):
print("Expecting chunk {}: {!r}".format(i, chunk))
assert pyqiodev.readline(size) == chunk
def test_write(self, pyqiodev):
"""Make sure writing and re-reading works."""
- with pyqiodev.open(QIODevice.OpenModeFlag.WriteOnly) as f:
+ with pyqiodev.open(core.QIODevice.OpenModeFlag.WriteOnly) as f:
f.write(b'foo\n')
f.write(b'bar\n')
- pyqiodev.open(QIODevice.OpenModeFlag.ReadOnly)
+ pyqiodev.open(core.QIODevice.OpenModeFlag.ReadOnly)
assert pyqiodev.read() == b'foo\nbar\n'
def test_write_error(self, pyqiodev_failing):
@@ -855,8 +854,8 @@ class TestPyQIODevice:
reason="Needs /dev/full.")
def test_write_error_real(self):
"""Test a real write error with /dev/full on supported systems."""
- qf = QFile('/dev/full')
- qf.open(QIODevice.OpenModeFlag.WriteOnly | QIODevice.OpenModeFlag.Unbuffered)
+ qf = core.QFile('/dev/full')
+ qf.open(core.QIODevice.OpenModeFlag.WriteOnly | core.QIODevice.OpenModeFlag.Unbuffered)
dev = qtutils.PyQIODevice(qf)
with pytest.raises(OSError, match='No space left on device'):
dev.write(b'foo')
@@ -875,9 +874,9 @@ class TestPyQIODevice:
size: The size to pass to read()
chunks: A list of expected data chunks.
"""
- with pyqiodev.open(QIODevice.OpenModeFlag.WriteOnly) as f:
+ with pyqiodev.open(core.QIODevice.OpenModeFlag.WriteOnly) as f:
f.write(b'1234567890')
- pyqiodev.open(QIODevice.OpenModeFlag.ReadOnly)
+ pyqiodev.open(core.QIODevice.OpenModeFlag.ReadOnly)
for i, chunk in enumerate(chunks):
print("Expecting chunk {}: {!r}".format(i, chunk))
assert pyqiodev.read(size) == chunk
@@ -923,18 +922,18 @@ class TestEventLoop:
def test_normal_exec(self):
"""Test exec_ without double-executing."""
self.loop = qtutils.EventLoop()
- QTimer.singleShot(100, self._assert_executing)
- QTimer.singleShot(200, self.loop.quit)
+ core.QTimer.singleShot(100, self._assert_executing)
+ core.QTimer.singleShot(200, self.loop.quit)
self.loop.exec()
assert not self.loop._executing
def test_double_exec(self):
"""Test double-executing."""
self.loop = qtutils.EventLoop()
- QTimer.singleShot(100, self._assert_executing)
- QTimer.singleShot(200, self._double_exec)
- QTimer.singleShot(300, self._assert_executing)
- QTimer.singleShot(400, self.loop.quit)
+ core.QTimer.singleShot(100, self._assert_executing)
+ core.QTimer.singleShot(200, self._double_exec)
+ core.QTimer.singleShot(300, self._assert_executing)
+ core.QTimer.singleShot(400, self.loop.quit)
self.loop.exec()
assert not self.loop._executing
@@ -971,9 +970,9 @@ class TestInterpolateColor:
def test_invalid_colorspace(self, colors):
"""Test an invalid colorspace."""
with pytest.raises(ValueError):
- qtutils.interpolate_color(colors.white, colors.black, 10, QColor.Spec.Cmyk)
+ qtutils.interpolate_color(colors.white, colors.black, 10, gui.QColor.Spec.Cmyk)
- @pytest.mark.parametrize('colorspace', [QColor.Spec.Rgb, QColor.Spec.Hsv, QColor.Spec.Hsl])
+ @pytest.mark.parametrize('colorspace', [gui.QColor.Spec.Rgb, gui.QColor.Spec.Hsv, gui.QColor.Spec.Hsl])
def test_0_100(self, colors, colorspace):
"""Test 0% and 100% in different colorspaces."""
white = qtutils.interpolate_color(colors.white, colors.black, 0, colorspace)
@@ -984,7 +983,7 @@ class TestInterpolateColor:
def test_interpolation_rgb(self):
"""Test an interpolation in the RGB colorspace."""
color = qtutils.interpolate_color(
- testutils.Color(0, 40, 100), testutils.Color(0, 20, 200), 50, QColor.Spec.Rgb)
+ testutils.Color(0, 40, 100), testutils.Color(0, 20, 200), 50, gui.QColor.Spec.Rgb)
assert testutils.Color(color) == testutils.Color(0, 30, 150)
def test_interpolation_hsv(self):
@@ -993,7 +992,7 @@ class TestInterpolateColor:
stop = testutils.Color()
start.setHsv(0, 40, 100)
stop.setHsv(0, 20, 200)
- color = qtutils.interpolate_color(start, stop, 50, QColor.Spec.Hsv)
+ color = qtutils.interpolate_color(start, stop, 50, gui.QColor.Spec.Hsv)
expected = testutils.Color()
expected.setHsv(0, 30, 150)
assert testutils.Color(color) == expected
@@ -1004,12 +1003,12 @@ class TestInterpolateColor:
stop = testutils.Color()
start.setHsl(0, 40, 100)
stop.setHsl(0, 20, 200)
- color = qtutils.interpolate_color(start, stop, 50, QColor.Spec.Hsl)
+ color = qtutils.interpolate_color(start, stop, 50, gui.QColor.Spec.Hsl)
expected = testutils.Color()
expected.setHsl(0, 30, 150)
assert testutils.Color(color) == expected
- @pytest.mark.parametrize('colorspace', [QColor.Spec.Rgb, QColor.Spec.Hsv, QColor.Spec.Hsl])
+ @pytest.mark.parametrize('colorspace', [gui.QColor.Spec.Rgb, gui.QColor.Spec.Hsv, gui.QColor.Spec.Hsl])
def test_interpolation_alpha(self, colorspace):
"""Test interpolation of colorspace's alpha."""
start = testutils.Color(0, 0, 0, 30)
@@ -1027,7 +1026,7 @@ class TestInterpolateColor:
"""Test an interpolation with a gradient turned off."""
color = qtutils.interpolate_color(
testutils.Color(0, 0, 0), testutils.Color(255, 255, 255), percentage, None)
- assert isinstance(color, QColor)
+ assert isinstance(color, gui.QColor)
assert testutils.Color(color) == testutils.Color(*expected)
@@ -1036,10 +1035,10 @@ class TestLibraryPath:
def test_simple(self):
try:
# Qt 6
- path = QLibraryInfo.path(QLibraryInfo.LibraryPath.DataPath)
+ path = core.QLibraryInfo.path(core.QLibraryInfo.LibraryPath.DataPath)
except AttributeError:
# Qt 5
- path = QLibraryInfo.location(QLibraryInfo.LibraryLocation.DataPath)
+ path = core.QLibraryInfo.location(core.QLibraryInfo.LibraryLocation.DataPath)
assert path
assert qtutils.library_path(qtutils.LibraryPath.data).as_posix() == path
@@ -1054,16 +1053,16 @@ class TestLibraryPath:
def test_values_match_qt(self):
try:
# Qt 6
- enumtype = QLibraryInfo.LibraryPath
+ enumtype = core.QLibraryInfo.LibraryPath
except AttributeError:
- enumtype = QLibraryInfo.LibraryLocation
+ enumtype = core.QLibraryInfo.LibraryLocation
our_names = {member.value for member in qtutils.LibraryPath}
- qt_names = set(testutils.enum_members(QLibraryInfo, enumtype))
+ qt_names = set(testutils.enum_members(core.QLibraryInfo, enumtype))
qt_names.discard("ImportsPath") # Moved to QmlImportsPath in Qt 6
assert qt_names == our_names
def test_extract_enum_val():
- value = qtutils.extract_enum_val(Qt.KeyboardModifier.ShiftModifier)
+ value = qtutils.extract_enum_val(core.Qt.KeyboardModifier.ShiftModifier)
assert value == 0x02000000
diff --git a/tests/unit/utils/test_standarddir.py b/tests/unit/utils/test_standarddir.py
index c7795d94a..c61648686 100644
--- a/tests/unit/utils/test_standarddir.py
+++ b/tests/unit/utils/test_standarddir.py
@@ -28,7 +28,7 @@ import textwrap
import logging
import subprocess
-from qutebrowser.qt.core import QStandardPaths
+from qutebrowser.qt import core
import pytest
from qutebrowser.utils import standarddir, utils, version
@@ -114,8 +114,8 @@ def test_fake_windows(tmpdir, monkeypatch, what):
def test_fake_haiku(tmpdir, monkeypatch):
"""Test getting data dir on HaikuOS."""
locations = {
- QStandardPaths.StandardLocation.AppDataLocation: '',
- QStandardPaths.StandardLocation.ConfigLocation: str(tmpdir / 'config' / APPNAME),
+ core.QStandardPaths.StandardLocation.AppDataLocation: '',
+ core.QStandardPaths.StandardLocation.ConfigLocation: str(tmpdir / 'config' / APPNAME),
}
monkeypatch.setattr(standarddir.QStandardPaths, 'writableLocation',
locations.get)
@@ -135,14 +135,14 @@ class TestWritableLocation:
'qutebrowser.utils.standarddir.QStandardPaths.writableLocation',
lambda typ: '')
with pytest.raises(standarddir.EmptyValueError):
- standarddir._writable_location(QStandardPaths.StandardLocation.AppDataLocation)
+ standarddir._writable_location(core.QStandardPaths.StandardLocation.AppDataLocation)
def test_sep(self, monkeypatch):
"""Make sure the right kind of separator is used."""
monkeypatch.setattr(standarddir.os, 'sep', '\\')
monkeypatch.setattr(standarddir.os.path, 'join',
lambda *parts: '\\'.join(parts))
- loc = standarddir._writable_location(QStandardPaths.StandardLocation.AppDataLocation)
+ loc = standarddir._writable_location(core.QStandardPaths.StandardLocation.AppDataLocation)
assert '/' not in loc
assert '\\' in loc
diff --git a/tests/unit/utils/test_urlmatch.py b/tests/unit/utils/test_urlmatch.py
index c1b9e11be..ab2848b4d 100644
--- a/tests/unit/utils/test_urlmatch.py
+++ b/tests/unit/utils/test_urlmatch.py
@@ -33,7 +33,7 @@ import string
import pytest
import hypothesis
import hypothesis.strategies as hst
-from qutebrowser.qt.core import QUrl
+from qutebrowser.qt import core
from qutebrowser.utils import urlmatch
@@ -203,7 +203,7 @@ def test_whitespace_hosts(host):
This is a deviation from Chromium.
"""
template = 'https://{}/*'
- url = QUrl(template.format(host))
+ url = core.QUrl(template.format(host))
assert not url.isValid()
with pytest.raises(urlmatch.ParseError,
@@ -288,7 +288,7 @@ class TestMatchAllPagesForGivenScheme:
("http://[::1]/bar", True),
])
def test_urls(self, up, url, expected):
- assert up.matches(QUrl(url)) == expected
+ assert up.matches(core.QUrl(url)) == expected
class TestMatchAllDomains:
@@ -313,7 +313,7 @@ class TestMatchAllDomains:
("https://google.com/", False),
])
def test_urls(self, up, url, expected):
- assert up.matches(QUrl(url)) == expected
+ assert up.matches(core.QUrl(url)) == expected
class TestMatchSubdomains:
@@ -340,7 +340,7 @@ class TestMatchSubdomains:
("http://yahoo.com/foobar", False),
])
def test_urls(self, up, url, expected):
- assert up.matches(QUrl(url)) == expected
+ assert up.matches(core.QUrl(url)) == expected
class TestMatchGlobEscaping:
@@ -365,7 +365,7 @@ class TestMatchGlobEscaping:
(r"file:///fooXbar\hellobaz", False),
])
def test_urls(self, up, url, expected):
- assert up.matches(QUrl(url)) == expected
+ assert up.matches(core.QUrl(url)) == expected
class TestMatchIpAddresses:
@@ -396,7 +396,7 @@ class TestMatchIpAddresses:
])
def test_urls(self, pattern, expected):
up = urlmatch.UrlPattern(pattern)
- assert up.matches(QUrl("http://127.0.0.1")) == expected
+ assert up.matches(core.QUrl("http://127.0.0.1")) == expected
## FIXME Missing TEST(ExtensionURLPatternTest, Match8) (unicode)?
@@ -423,7 +423,7 @@ class TestMatchChromeUrls:
("chrome://history", False),
])
def test_urls(self, up, url, expected):
- assert up.matches(QUrl(url)) == expected
+ assert up.matches(core.QUrl(url)) == expected
class TestMatchAnything:
@@ -461,7 +461,7 @@ class TestMatchAnything:
"javascript:",
])
def test_urls(self, up, url):
- assert up.matches(QUrl(url))
+ assert up.matches(core.QUrl(url))
@pytest.mark.parametrize('pattern, url, expected', [
@@ -474,7 +474,7 @@ class TestMatchAnything:
])
def test_special_schemes(pattern, url, expected):
"""Based on TEST(ExtensionURLPatternTest, Match13)."""
- assert urlmatch.UrlPattern(pattern).matches(QUrl(url)) == expected
+ assert urlmatch.UrlPattern(pattern).matches(core.QUrl(url)) == expected
class TestFileScheme:
@@ -506,7 +506,7 @@ class TestFileScheme:
("file://localhost/foo", True),
])
def test_urls(self, up, url, expected):
- assert up.matches(QUrl(url)) == expected
+ assert up.matches(core.QUrl(url)) == expected
class TestMatchSpecificPort:
@@ -531,7 +531,7 @@ class TestMatchSpecificPort:
("http://www.example.com:8080/foo", False),
])
def test_urls(self, up, url, expected):
- assert up.matches(QUrl(url)) == expected
+ assert up.matches(core.QUrl(url)) == expected
class TestExplicitPortWildcard:
@@ -556,15 +556,15 @@ class TestExplicitPortWildcard:
("http://www.example.com:8080/foo", True),
])
def test_urls(self, up, url, expected):
- assert up.matches(QUrl(url)) == expected
+ assert up.matches(core.QUrl(url)) == expected
def test_ignore_missing_slashes():
"""Based on TEST(ExtensionURLPatternTest, IgnoreMissingBackslashes)."""
pattern1 = urlmatch.UrlPattern("http://www.example.com/example")
pattern2 = urlmatch.UrlPattern("http://www.example.com/example/*")
- url1 = QUrl('http://www.example.com/example')
- url2 = QUrl('http://www.example.com/example/')
+ url1 = core.QUrl('http://www.example.com/example')
+ url2 = core.QUrl('http://www.example.com/example/')
# Same patterns should match same URLs.
assert pattern1.matches(url1)
@@ -577,7 +577,7 @@ def test_ignore_missing_slashes():
def test_trailing_slash():
"""Contrary to Chromium, we allow to leave off a trailing slash."""
- url = QUrl('http://www.example.com/')
+ url = core.QUrl('http://www.example.com/')
pattern = urlmatch.UrlPattern('http://www.example.com')
assert pattern.matches(url)
@@ -603,7 +603,7 @@ def test_trailing_dot_domain(pattern, url):
[1] http://www.dns-sd.org./TrailingDotsInDomainNames.html
[2] http://www.ietf.org/rfc/rfc1738.txt
"""
- assert urlmatch.UrlPattern(pattern).matches(QUrl(url))
+ assert urlmatch.UrlPattern(pattern).matches(core.QUrl(url))
class TestUncanonicalizedUrl:
@@ -624,7 +624,7 @@ class TestUncanonicalizedUrl:
practice.
"""
pattern = urlmatch.UrlPattern('*://*.gOoGle.com/*')
- assert pattern.matches(QUrl(url))
+ assert pattern.matches(core.QUrl(url))
@pytest.mark.parametrize('url', [
'https://ɡoogle.com',
@@ -636,7 +636,7 @@ class TestUncanonicalizedUrl:
The first 'g' isn't actually a 'g'.
"""
pattern = urlmatch.UrlPattern('https://*.ɡoogle.com/*')
- assert pattern.matches(QUrl(url))
+ assert pattern.matches(core.QUrl(url))
@pytest.mark.xfail(reason="Gets accepted by urllib.parse")
def test_failing_canonicalization(self):
@@ -671,7 +671,7 @@ class TestUncanonicalizedUrl:
def test_urlpattern_benchmark(benchmark):
- url = QUrl('https://www.example.com/barfoobar')
+ url = core.QUrl('https://www.example.com/barfoobar')
def run():
up = urlmatch.UrlPattern('https://*.example.com/*foo*')
@@ -707,7 +707,7 @@ def test_urlpattern_hypothesis(pattern):
up = urlmatch.UrlPattern(pattern)
except urlmatch.ParseError:
return
- up.matches(QUrl('https://www.example.com/'))
+ up.matches(core.QUrl('https://www.example.com/'))
@pytest.mark.parametrize('text1, text2, equal', [
diff --git a/tests/unit/utils/test_urlutils.py b/tests/unit/utils/test_urlutils.py
index a94ecef6a..2ba6b7566 100644
--- a/tests/unit/utils/test_urlutils.py
+++ b/tests/unit/utils/test_urlutils.py
@@ -24,8 +24,7 @@ import logging
import dataclasses
import urllib.parse
-from qutebrowser.qt.core import QUrl
-from qutebrowser.qt.network import QNetworkProxy
+from qutebrowser.qt import network, core
import pytest
import hypothesis
import hypothesis.strategies
@@ -135,7 +134,7 @@ class TestFuzzyUrl:
url = urlutils.fuzzy_url('foo', cwd='cwd', relative=True)
os_mock.path.exists.assert_called_once_with('cwd/foo')
- assert url == QUrl('file:cwd/foo')
+ assert url == core.QUrl('file:cwd/foo')
def test_file_relative(self, os_mock):
"""Test with relative=True and cwd unset."""
@@ -146,7 +145,7 @@ class TestFuzzyUrl:
url = urlutils.fuzzy_url('foo', relative=True)
os_mock.path.exists.assert_called_once_with('abs_path')
- assert url == QUrl('file:abs_path')
+ assert url == core.QUrl('file:abs_path')
def test_file_relative_os_error(self, os_mock, is_url_mock):
"""Test with relative=True, cwd unset and abspath raising OSError."""
@@ -157,11 +156,11 @@ class TestFuzzyUrl:
url = urlutils.fuzzy_url('foo', relative=True)
assert not os_mock.path.exists.called
- assert url == QUrl('http://foo')
+ assert url == core.QUrl('http://foo')
@pytest.mark.parametrize('path, expected', [
- ('/foo', QUrl('file:///foo')),
- ('/bar\n', QUrl('file:///bar')),
+ ('/foo', core.QUrl('file:///foo')),
+ ('/bar\n', core.QUrl('file:///bar')),
])
def test_file_absolute(self, path, expected, os_mock):
"""Test with an absolute path."""
@@ -178,7 +177,7 @@ class TestFuzzyUrl:
os_mock.path.isabs.return_value = True
url = urlutils.fuzzy_url('~/foo')
- assert url == QUrl('file://' + os.path.expanduser('~/foo'))
+ assert url == core.QUrl('file://' + os.path.expanduser('~/foo'))
def test_address(self, os_mock, is_url_mock):
"""Test passing something with relative=False."""
@@ -186,16 +185,16 @@ class TestFuzzyUrl:
is_url_mock.return_value = True
url = urlutils.fuzzy_url('foo')
- assert url == QUrl('http://foo')
+ assert url == core.QUrl('http://foo')
def test_search_term(self, os_mock, is_url_mock, get_search_url_mock):
"""Test passing something with do_search=True."""
os_mock.path.isabs.return_value = False
is_url_mock.return_value = False
- get_search_url_mock.return_value = QUrl('search_url')
+ get_search_url_mock.return_value = core.QUrl('search_url')
url = urlutils.fuzzy_url('foo', do_search=True)
- assert url == QUrl('search_url')
+ assert url == core.QUrl('search_url')
def test_search_term_value_error(self, os_mock, is_url_mock,
get_search_url_mock):
@@ -205,14 +204,14 @@ class TestFuzzyUrl:
get_search_url_mock.side_effect = ValueError
url = urlutils.fuzzy_url('foo', do_search=True)
- assert url == QUrl('http://foo')
+ assert url == core.QUrl('http://foo')
def test_no_do_search(self, is_url_mock):
"""Test with do_search = False."""
is_url_mock.return_value = False
url = urlutils.fuzzy_url('foo', do_search=False)
- assert url == QUrl('http://foo')
+ assert url == core.QUrl('http://foo')
@pytest.mark.parametrize('do_search', [True, False])
def test_invalid_url(self, do_search, caplog):
@@ -233,11 +232,11 @@ class TestFuzzyUrl:
])
def test_force_search(self, urlstring, get_search_url_mock):
"""Test the force search option."""
- get_search_url_mock.return_value = QUrl('search_url')
+ get_search_url_mock.return_value = core.QUrl('search_url')
url = urlutils.fuzzy_url(urlstring, force_search=True)
- assert url == QUrl('search_url')
+ assert url == core.QUrl('search_url')
@pytest.mark.parametrize('path, check_exists', [
('/foo', False),
@@ -273,7 +272,7 @@ class TestFuzzyUrl:
('www.qutebrowser.org', False),
])
def test_special_urls(url, special):
- assert urlutils.is_special_url(QUrl(url)) == special
+ assert urlutils.is_special_url(core.QUrl(url)) == special
@pytest.mark.parametrize('open_base_url', [True, False])
@@ -321,7 +320,7 @@ def test_get_search_url_for_path_search(config_stub, url, host, path, open_base_
config_stub.val.url.open_base_url = open_base_url
url = urlutils._get_search_url(url)
assert url.host() == host
- assert url.path(options=QUrl.ComponentFormattingOption.PrettyDecoded) == '/' + path
+ assert url.path(options=core.QUrl.ComponentFormattingOption.PrettyDecoded) == '/' + path
@pytest.mark.parametrize('url, host', [
@@ -352,7 +351,7 @@ def test_get_search_url_invalid(url):
@dataclasses.dataclass
class UrlParams:
- url: QUrl
+ url: core.QUrl
is_url: bool = True
is_url_no_autosearch: bool = True
use_dns: bool = True
@@ -497,7 +496,7 @@ def test_invalid_url_error(message_mock, caplog, url, valid, has_err_string):
valid: Whether the QUrl is valid (isValid() == True).
has_err_string: Whether the QUrl is expected to have errorString set.
"""
- qurl = QUrl(url)
+ qurl = core.QUrl(url)
assert qurl.isValid() == valid
if valid:
with pytest.raises(ValueError):
@@ -530,7 +529,7 @@ def test_raise_cmdexc_if_invalid(url, valid, has_err_string):
valid: Whether the QUrl is valid (isValid() == True).
has_err_string: Whether the QUrl is expected to have errorString set.
"""
- qurl = QUrl(url)
+ qurl = core.QUrl(url)
assert qurl.isValid() == valid
if valid:
urlutils.raise_cmdexc_if_invalid(qurl)
@@ -545,36 +544,36 @@ def test_raise_cmdexc_if_invalid(url, valid, has_err_string):
@pytest.mark.parametrize('qurl, output', [
- (QUrl(), None),
- (QUrl('http://qutebrowser.org/test.html'), 'test.html'),
- (QUrl('http://qutebrowser.org/foo.html#bar'), 'foo.html'),
- (QUrl('http://user:password@qutebrowser.org/foo?bar=baz#fish'), 'foo'),
- (QUrl('http://qutebrowser.org/'), 'qutebrowser.org.html'),
- (QUrl('qute://'), None),
+ (core.QUrl(), None),
+ (core.QUrl('http://qutebrowser.org/test.html'), 'test.html'),
+ (core.QUrl('http://qutebrowser.org/foo.html#bar'), 'foo.html'),
+ (core.QUrl('http://user:password@qutebrowser.org/foo?bar=baz#fish'), 'foo'),
+ (core.QUrl('http://qutebrowser.org/'), 'qutebrowser.org.html'),
+ (core.QUrl('qute://'), None),
# data URL support
- (QUrl('data:text/plain,'), 'download.txt'),
- (QUrl('data:application/pdf,'), 'download.pdf'),
- (QUrl('data:foo/bar,'), 'download'), # unknown extension
- (QUrl('data:text/xul,'), 'download.xul'), # strict=False
- (QUrl('data:'), None), # invalid data URL
+ (core.QUrl('data:text/plain,'), 'download.txt'),
+ (core.QUrl('data:application/pdf,'), 'download.pdf'),
+ (core.QUrl('data:foo/bar,'), 'download'), # unknown extension
+ (core.QUrl('data:text/xul,'), 'download.xul'), # strict=False
+ (core.QUrl('data:'), None), # invalid data URL
])
def test_filename_from_url(qurl, output):
assert urlutils.filename_from_url(qurl) == output
-@pytest.mark.parametrize('qurl', [QUrl(), QUrl('qute://'), QUrl('data:')])
+@pytest.mark.parametrize('qurl', [core.QUrl(), core.QUrl('qute://'), core.QUrl('data:')])
def test_filename_from_url_fallback(qurl):
assert urlutils.filename_from_url(qurl, fallback='fallback') == 'fallback'
@pytest.mark.parametrize('qurl, expected', [
- (QUrl('ftp://example.com/'), ('ftp', 'example.com', 21)),
- (QUrl('ftp://example.com:2121/'), ('ftp', 'example.com', 2121)),
- (QUrl('http://qutebrowser.org:8010/waterfall'),
+ (core.QUrl('ftp://example.com/'), ('ftp', 'example.com', 21)),
+ (core.QUrl('ftp://example.com:2121/'), ('ftp', 'example.com', 2121)),
+ (core.QUrl('http://qutebrowser.org:8010/waterfall'),
('http', 'qutebrowser.org', 8010)),
- (QUrl('https://example.com/'), ('https', 'example.com', 443)),
- (QUrl('https://example.com:4343/'), ('https', 'example.com', 4343)),
- (QUrl('http://user:password@qutebrowser.org/foo?bar=baz#fish'),
+ (core.QUrl('https://example.com/'), ('https', 'example.com', 443)),
+ (core.QUrl('https://example.com:4343/'), ('https', 'example.com', 4343)),
+ (core.QUrl('http://user:password@qutebrowser.org/foo?bar=baz#fish'),
('http', 'qutebrowser.org', 80)),
])
def test_host_tuple_valid(qurl, expected):
@@ -582,10 +581,10 @@ def test_host_tuple_valid(qurl, expected):
@pytest.mark.parametrize('qurl, expected', [
- (QUrl(), urlutils.InvalidUrlError),
- (QUrl('qute://'), ValueError),
- (QUrl('qute://foobar'), ValueError),
- (QUrl('mailto:nobody'), ValueError),
+ (core.QUrl(), urlutils.InvalidUrlError),
+ (core.QUrl('qute://'), ValueError),
+ (core.QUrl('qute://foobar'), ValueError),
+ (core.QUrl('mailto:nobody'), ValueError),
])
def test_host_tuple_invalid(qurl, expected):
with pytest.raises(expected):
@@ -595,9 +594,9 @@ def test_host_tuple_invalid(qurl, expected):
class TestInvalidUrlError:
@pytest.mark.parametrize('url, raising, has_err_string', [
- (QUrl(), False, False),
- (QUrl('http://www.example.com/'), True, False),
- (QUrl('://'), False, True),
+ (core.QUrl(), False, False),
+ (core.QUrl('http://www.example.com/'), True, False),
+ (core.QUrl('://'), False, True),
])
def test_invalid_url_error(self, url, raising, has_err_string):
"""Test InvalidUrlError.
@@ -641,8 +640,8 @@ class TestInvalidUrlError:
@pytest.mark.qt5_only # https://bugreports.qt.io/browse/QTBUG-80308
def test_same_domain(are_same, url1, url2):
"""Test same_domain."""
- assert urlutils.same_domain(QUrl(url1), QUrl(url2)) == are_same
- assert urlutils.same_domain(QUrl(url2), QUrl(url1)) == are_same
+ assert urlutils.same_domain(core.QUrl(url1), core.QUrl(url2)) == are_same
+ assert urlutils.same_domain(core.QUrl(url2), core.QUrl(url1)) == are_same
@pytest.mark.parametrize('url1, url2', [
@@ -652,7 +651,7 @@ def test_same_domain(are_same, url1, url2):
def test_same_domain_invalid_url(url1, url2):
"""Test same_domain with invalid URLs."""
with pytest.raises(urlutils.InvalidUrlError):
- urlutils.same_domain(QUrl(url1), QUrl(url2))
+ urlutils.same_domain(core.QUrl(url1), core.QUrl(url2))
@pytest.mark.parametrize('url, expected', [
@@ -662,7 +661,7 @@ def test_same_domain_invalid_url(url1, url2):
'http://foo.bar/?header=text/pl%C3%A4in'),
])
def test_encoded_url(url, expected):
- url = QUrl(url)
+ url = core.QUrl(url)
assert urlutils.encoded_url(url) == expected
@@ -672,7 +671,7 @@ def test_file_url():
def test_data_url():
url = urlutils.data_url('text/plain', b'foo')
- assert url == QUrl('data:text/plain;base64,Zm9v')
+ assert url == core.QUrl('data:text/plain;base64,Zm9v')
qurl_idna2003 = pytest.mark.skipif(
@@ -689,24 +688,24 @@ qurl_uts46 = pytest.mark.xfail(
@pytest.mark.parametrize('url, expected', [
# No IDN
- (QUrl('http://www.example.com'), 'http://www.example.com'),
+ (core.QUrl('http://www.example.com'), 'http://www.example.com'),
# IDN in domain
- (QUrl('http://www.ä.com'), '(www.xn--4ca.com) http://www.ä.com'),
+ (core.QUrl('http://www.ä.com'), '(www.xn--4ca.com) http://www.ä.com'),
# IDN with non-whitelisted TLD
- (QUrl('http://www.ä.foo'), 'http://www.xn--4ca.foo'),
+ (core.QUrl('http://www.ä.foo'), 'http://www.xn--4ca.foo'),
# Unicode only in path
- (QUrl('http://www.example.com/ä'), 'http://www.example.com/ä'),
+ (core.QUrl('http://www.example.com/ä'), 'http://www.example.com/ä'),
# Unicode only in TLD (looks like Qt shows Punycode with рф...)
- (QUrl('http://www.example.xn--p1ai'),
+ (core.QUrl('http://www.example.xn--p1ai'),
'(www.example.xn--p1ai) http://www.example.рф'),
# https://bugreports.qt.io/browse/QTBUG-60364
pytest.param(
- QUrl('http://www.xn--80ak6aa92e.com'),
+ core.QUrl('http://www.xn--80ak6aa92e.com'),
'http://www.xn--80ak6aa92e.com',
marks=qurl_idna2003,
),
pytest.param(
- QUrl('http://www.xn--80ak6aa92e.com'),
+ core.QUrl('http://www.xn--80ak6aa92e.com'),
'(www.xn--80ak6aa92e.com) http://www.аррӏе.com',
marks=qurl_uts46,
),
@@ -717,34 +716,34 @@ def test_safe_display_string(url, expected):
def test_safe_display_string_invalid():
with pytest.raises(urlutils.InvalidUrlError):
- urlutils.safe_display_string(QUrl())
+ urlutils.safe_display_string(core.QUrl())
class TestProxyFromUrl:
@pytest.mark.parametrize('url, expected', [
('socks://example.com/',
- QNetworkProxy(QNetworkProxy.ProxyType.Socks5Proxy, 'example.com')),
+ network.QNetworkProxy(network.QNetworkProxy.ProxyType.Socks5Proxy, 'example.com')),
('socks5://example.com',
- QNetworkProxy(QNetworkProxy.ProxyType.Socks5Proxy, 'example.com')),
+ network.QNetworkProxy(network.QNetworkProxy.ProxyType.Socks5Proxy, 'example.com')),
('socks5://example.com:2342',
- QNetworkProxy(QNetworkProxy.ProxyType.Socks5Proxy, 'example.com', 2342)),
+ network.QNetworkProxy(network.QNetworkProxy.ProxyType.Socks5Proxy, 'example.com', 2342)),
('socks5://foo@example.com',
- QNetworkProxy(QNetworkProxy.ProxyType.Socks5Proxy, 'example.com', 0, 'foo')),
+ network.QNetworkProxy(network.QNetworkProxy.ProxyType.Socks5Proxy, 'example.com', 0, 'foo')),
('socks5://foo:bar@example.com',
- QNetworkProxy(QNetworkProxy.ProxyType.Socks5Proxy, 'example.com', 0, 'foo',
+ network.QNetworkProxy(network.QNetworkProxy.ProxyType.Socks5Proxy, 'example.com', 0, 'foo',
'bar')),
('socks5://foo:bar@example.com:2323',
- QNetworkProxy(QNetworkProxy.ProxyType.Socks5Proxy, 'example.com', 2323,
+ network.QNetworkProxy(network.QNetworkProxy.ProxyType.Socks5Proxy, 'example.com', 2323,
'foo', 'bar')),
- ('direct://', QNetworkProxy(QNetworkProxy.ProxyType.NoProxy)),
+ ('direct://', network.QNetworkProxy(network.QNetworkProxy.ProxyType.NoProxy)),
])
def test_proxy_from_url_valid(self, url, expected):
- assert urlutils.proxy_from_url(QUrl(url)) == expected
+ assert urlutils.proxy_from_url(core.QUrl(url)) == expected
@pytest.mark.parametrize('scheme', ['pac+http', 'pac+https'])
def test_proxy_from_url_pac(self, scheme, qapp):
- fetcher = urlutils.proxy_from_url(QUrl('{}://foo'.format(scheme)))
+ fetcher = urlutils.proxy_from_url(core.QUrl('{}://foo'.format(scheme)))
assert isinstance(fetcher, pac.PACFetcher)
@pytest.mark.parametrize('url, exception', [
@@ -756,17 +755,17 @@ class TestProxyFromUrl:
])
def test_invalid(self, url, exception):
with pytest.raises(exception):
- urlutils.proxy_from_url(QUrl(url))
+ urlutils.proxy_from_url(core.QUrl(url))
class TestParseJavascriptUrl:
@pytest.mark.parametrize('url, message', [
- (QUrl(), ""),
- (QUrl('https://example.com'), "Expected a javascript:... URL"),
- (QUrl('javascript://example.com'),
+ (core.QUrl(), ""),
+ (core.QUrl('https://example.com'), "Expected a javascript:... URL"),
+ (core.QUrl('javascript://example.com'),
"URL contains unexpected components: example.com"),
- (QUrl('javascript://foo:bar@example.com:1234'),
+ (core.QUrl('javascript://foo:bar@example.com:1234'),
"URL contains unexpected components: foo:bar@example.com:1234"),
])
def test_invalid(self, url, message):
@@ -774,13 +773,13 @@ class TestParseJavascriptUrl:
urlutils.parse_javascript_url(url)
@pytest.mark.parametrize('url, source', [
- (QUrl('javascript:"hello" %0a "world"'), '"hello" \n "world"'),
- (QUrl('javascript:/'), '/'),
- (QUrl('javascript:///'), '///'),
+ (core.QUrl('javascript:"hello" %0a "world"'), '"hello" \n "world"'),
+ (core.QUrl('javascript:/'), '/'),
+ (core.QUrl('javascript:///'), '///'),
# https://github.com/web-platform-tests/wpt/blob/master/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-query-fragment-components.html
- (QUrl('javascript:"nope" ? "yep" : "what";'), '"nope" ? "yep" : "what";'),
- (QUrl('javascript:"wrong"; // # %0a "ok";'), '"wrong"; // # \n "ok";'),
- (QUrl('javascript:"%252525 ? %252525 # %252525"'),
+ (core.QUrl('javascript:"nope" ? "yep" : "what";'), '"nope" ? "yep" : "what";'),
+ (core.QUrl('javascript:"wrong"; // # %0a "ok";'), '"wrong"; // # \n "ok";'),
+ (core.QUrl('javascript:"%252525 ? %252525 # %252525"'),
'"%2525 ? %2525 # %2525"'),
])
def test_valid(self, url, source):
@@ -789,7 +788,7 @@ class TestParseJavascriptUrl:
@hypothesis.given(source=hypothesis.strategies.text())
def test_hypothesis(self, source):
scheme = 'javascript:'
- url = QUrl(scheme + urllib.parse.quote(source))
+ url = core.QUrl(scheme + urllib.parse.quote(source))
hypothesis.assume(url.isValid())
try:
diff --git a/tests/unit/utils/test_utils.py b/tests/unit/utils/test_utils.py
index 765fff3fd..06da02e75 100644
--- a/tests/unit/utils/test_utils.py
+++ b/tests/unit/utils/test_utils.py
@@ -29,9 +29,7 @@ import re
import shlex
import math
import operator
-
-from qutebrowser.qt.core import QUrl, QRect, QPoint
-from qutebrowser.qt.gui import QClipboard
+from qutebrowser.qt import gui
import pytest
import hypothesis
from hypothesis import strategies
@@ -41,6 +39,7 @@ import qutebrowser
import qutebrowser.utils # for test_qualname
from qutebrowser.utils import utils, usertypes
from qutebrowser.utils.utils import VersionNumber
+from qutebrowser.qt import core
class TestVersionNumber:
@@ -676,7 +675,7 @@ class TestGetSetClipboard:
def test_set(self, clipboard_mock, caplog):
utils.set_clipboard('Hello World')
clipboard_mock.setText.assert_called_with('Hello World',
- mode=QClipboard.Mode.Clipboard)
+ mode=gui.QClipboard.Mode.Clipboard)
assert not caplog.records
def test_set_unsupported_selection(self, clipboard_mock):
@@ -776,7 +775,7 @@ class TestOpenFile:
result = caplog.messages[0]
assert re.fullmatch(
r"Opening /foo/bar with the system application", result)
- openurl_mock.assert_called_with(QUrl('file:///foo/bar'))
+ openurl_mock.assert_called_with(core.QUrl('file:///foo/bar'))
def test_cmdline_sandboxed(self, fake_flatpak,
config_stub, message_mock, caplog):
@@ -795,12 +794,12 @@ class TestOpenFile:
assert caplog.messages[1] == ('Ignoring download dispatcher from '
'config in sandbox environment')
- openurl_mock.assert_called_with(QUrl('file:///foo/bar'))
+ openurl_mock.assert_called_with(core.QUrl('file:///foo/bar'))
def test_system_default_sandboxed(self, config_stub, openurl_mock,
fake_flatpak):
utils.open_file('/foo/bar')
- openurl_mock.assert_called_with(QUrl('file:///foo/bar'))
+ openurl_mock.assert_called_with(core.QUrl('file:///foo/bar'))
def test_unused():
@@ -998,8 +997,8 @@ class TestCleanupFileContext:
class TestParseRect:
@pytest.mark.parametrize('value, expected', [
- ('1x1+0+0', QRect(0, 0, 1, 1)),
- ('123x789+12+34', QRect(12, 34, 123, 789)),
+ ('1x1+0+0', core.QRect(0, 0, 1, 1)),
+ ('123x789+12+34', core.QRect(12, 34, 123, 789)),
])
def test_valid(self, value, expected):
assert utils.parse_rect(value) == expected
@@ -1048,9 +1047,9 @@ class TestParseRect:
class TestParsePoint:
@pytest.mark.parametrize('value, expected', [
- ('1,1', QPoint(1, 1)),
- ('123,789', QPoint(123, 789)),
- ('-123,-789', QPoint(-123, -789)),
+ ('1,1', core.QPoint(1, 1)),
+ ('123,789', core.QPoint(123, 789)),
+ ('-123,-789', core.QPoint(-123, -789)),
])
def test_valid(self, value, expected):
assert utils.parse_point(value) == expected
diff --git a/tests/unit/utils/test_version.py b/tests/unit/utils/test_version.py
index 96f724937..1ab8c127c 100644
--- a/tests/unit/utils/test_version.py
+++ b/tests/unit/utils/test_version.py
@@ -33,7 +33,7 @@ import dataclasses
import pytest
import hypothesis
import hypothesis.strategies
-from qutebrowser.qt.core import PYQT_VERSION_STR
+from qutebrowser.qt import webenginecore, core
import qutebrowser
from qutebrowser.config import config, websettings
@@ -1003,21 +1003,20 @@ class TestWebEngineVersions:
"""Compare the inferred Chromium version with the real one."""
pyqt_webengine_version = version._get_pyqt_webengine_qt_version()
if pyqt_webengine_version is None:
- if '.dev' in PYQT_VERSION_STR:
+ if '.dev' in core.PYQT_VERSION_STR:
pytest.skip("dev version of PyQt")
try:
- from qutebrowser.qt.webenginecore import (
- PYQT_WEBENGINE_VERSION_STR, PYQT_WEBENGINE_VERSION)
+ pass
except ImportError as e:
# QtWebKit
pytest.skip(str(e))
- if 0x060000 > PYQT_WEBENGINE_VERSION >= 0x050F02:
+ if 0x060000 > webenginecore.PYQT_WEBENGINE_VERSION >= 0x050F02:
# Starting with Qt 5.15.2, we can only do bad guessing anyways...
pytest.skip("Could be QtWebEngine 5.15.2 or 5.15.3")
- pyqt_webengine_version = PYQT_WEBENGINE_VERSION_STR
+ pyqt_webengine_version = webenginecore.PYQT_WEBENGINE_VERSION_STR
versions = version.WebEngineVersions.from_pyqt(pyqt_webengine_version)
inferred = versions.chromium
diff --git a/tests/unit/utils/usertypes/test_timer.py b/tests/unit/utils/usertypes/test_timer.py
index 97c116f01..5eb7adc48 100644
--- a/tests/unit/utils/usertypes/test_timer.py
+++ b/tests/unit/utils/usertypes/test_timer.py
@@ -20,12 +20,12 @@
"""Tests for Timer."""
import pytest
-from qutebrowser.qt.core import QObject
+from qutebrowser.qt import core
from qutebrowser.utils import usertypes
-class Parent(QObject):
+class Parent(core.QObject):
"""Class for test_parent()."""