summaryrefslogtreecommitdiff
path: root/qutebrowser/browser/webengine/webview.py
diff options
context:
space:
mode:
Diffstat (limited to 'qutebrowser/browser/webengine/webview.py')
-rw-r--r--qutebrowser/browser/webengine/webview.py100
1 files changed, 57 insertions, 43 deletions
diff --git a/qutebrowser/browser/webengine/webview.py b/qutebrowser/browser/webengine/webview.py
index 4dd1b2a71..66968a954 100644
--- a/qutebrowser/browser/webengine/webview.py
+++ b/qutebrowser/browser/webengine/webview.py
@@ -21,9 +21,11 @@
from typing import List, Iterable
-from PyQt5.QtCore import pyqtSignal, QUrl
-from PyQt5.QtGui import QPalette
-from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEnginePage
+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.browser import shared
from qutebrowser.browser.webengine import webenginesettings, certificateerror
@@ -32,8 +34,8 @@ from qutebrowser.utils import log, debug, usertypes
_QB_FILESELECTION_MODES = {
- QWebEnginePage.FileSelectOpen: shared.FileSelectionMode.single_file,
- QWebEnginePage.FileSelectOpenMultiple: shared.FileSelectionMode.multiple_files,
+ QWebEnginePage.FileSelectionMode.FileSelectOpen: shared.FileSelectionMode.single_file,
+ 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
@@ -54,7 +56,7 @@ class WebEngineView(QWebEngineView):
self._win_id = win_id
self._tabdata = tabdata
- theme_color = self.style().standardPalette().color(QPalette.Base)
+ theme_color = self.style().standardPalette().color(QPalette.ColorRole.Base)
if private:
assert webenginesettings.private_profile is not None
profile = webenginesettings.private_profile
@@ -106,21 +108,21 @@ class WebEngineView(QWebEngineView):
log.webview.debug("createWindow with type {}, background {}".format(
debug_type, background))
- if wintype == QWebEnginePage.WebBrowserWindow:
+ if wintype == QWebEnginePage.WebWindowType.WebBrowserWindow:
# Shift-Alt-Click
target = usertypes.ClickTarget.window
- elif wintype == QWebEnginePage.WebDialog:
+ elif wintype == QWebEnginePage.WebWindowType.WebDialog:
log.webview.warning("{} requested, but we don't support "
"that!".format(debug_type))
target = usertypes.ClickTarget.tab
- elif wintype == QWebEnginePage.WebBrowserTab:
+ elif wintype == 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.WebBrowserBackgroundTab:
+ elif wintype == QWebEnginePage.WebWindowType.WebBrowserBackgroundTab:
# Middle-click / Ctrl-Click
if background:
target = usertypes.ClickTarget.tab_bg
@@ -150,8 +152,9 @@ class WebEnginePage(QWebEnginePage):
Signals:
certificate_error: Emitted on certificate errors.
- Needs to be directly connected to a slot setting the
- 'ignore' attribute.
+ Needs to be directly connected to a slot calling
+ .accept_certificate(), .reject_certificate, or
+ .defer().
shutting_down: Emitted when the page is shutting down.
navigation_request: Emitted on acceptNavigationRequest.
"""
@@ -160,12 +163,43 @@ class WebEnginePage(QWebEnginePage):
shutting_down = pyqtSignal()
navigation_request = pyqtSignal(usertypes.NavigationRequest)
+ _JS_LOG_LEVEL_MAPPING = {
+ QWebEnginePage.JavaScriptConsoleMessageLevel.InfoMessageLevel:
+ usertypes.JsLogLevel.info,
+ QWebEnginePage.JavaScriptConsoleMessageLevel.WarningMessageLevel:
+ usertypes.JsLogLevel.warning,
+ QWebEnginePage.JavaScriptConsoleMessageLevel.ErrorMessageLevel:
+ usertypes.JsLogLevel.error,
+ }
+
+ _NAVIGATION_TYPE_MAPPING = {
+ QWebEnginePage.NavigationType.NavigationTypeLinkClicked:
+ usertypes.NavigationRequest.Type.link_clicked,
+ QWebEnginePage.NavigationType.NavigationTypeTyped:
+ usertypes.NavigationRequest.Type.typed,
+ QWebEnginePage.NavigationType.NavigationTypeFormSubmitted:
+ usertypes.NavigationRequest.Type.form_submitted,
+ QWebEnginePage.NavigationType.NavigationTypeBackForward:
+ usertypes.NavigationRequest.Type.back_forward,
+ QWebEnginePage.NavigationType.NavigationTypeReload:
+ usertypes.NavigationRequest.Type.reload,
+ QWebEnginePage.NavigationType.NavigationTypeOther:
+ usertypes.NavigationRequest.Type.other,
+ QWebEnginePage.NavigationType.NavigationTypeRedirect:
+ usertypes.NavigationRequest.Type.redirect,
+ }
+
def __init__(self, *, theme_color, profile, parent=None):
super().__init__(profile, parent)
self._is_shutting_down = False
self._theme_color = theme_color
self._set_bg_color()
config.instance.changed.connect(self._set_bg_color)
+ if machinery.IS_QT6:
+ self.certificateError.connect( # pylint: disable=no-member
+ self._handle_certificate_error
+ )
+ # Qt 5: Overridden method instead of signal
@config.change_filter('colors.webpage.bg')
def _set_bg_color(self):
@@ -178,11 +212,17 @@ class WebEnginePage(QWebEnginePage):
self._is_shutting_down = True
self.shutting_down.emit()
- def certificateError(self, error):
+ @pyqtSlot(QWebEngineCertificateError)
+ def _handle_certificate_error(self, qt_error):
"""Handle certificate errors coming from Qt."""
- error = certificateerror.CertificateErrorWrapper(error)
+ error = certificateerror.CertificateErrorWrapper(qt_error)
self.certificate_error.emit(error)
- return error.ignore
+ # Right now, we never defer accepting, due to a PyQt bug
+ return error.certificate_was_accepted()
+
+ if machinery.IS_QT5:
+ # Overridden method instead of signal
+ certificateError = _handle_certificate_error # noqa: N815
def javaScriptConfirm(self, url, js_msg):
"""Override javaScriptConfirm to use qutebrowser prompts."""
@@ -216,42 +256,16 @@ class WebEnginePage(QWebEnginePage):
def javaScriptConsoleMessage(self, level, msg, line, source):
"""Log javascript messages to qutebrowser's log."""
- level_map = {
- QWebEnginePage.InfoMessageLevel: usertypes.JsLogLevel.info,
- QWebEnginePage.WarningMessageLevel: usertypes.JsLogLevel.warning,
- QWebEnginePage.ErrorMessageLevel: usertypes.JsLogLevel.error,
- }
- shared.javascript_log_message(level_map[level], source, line, msg)
+ shared.javascript_log_message(self._JS_LOG_LEVEL_MAPPING[level], source, line, msg)
def acceptNavigationRequest(self,
url: QUrl,
typ: QWebEnginePage.NavigationType,
is_main_frame: bool) -> bool:
"""Override acceptNavigationRequest to forward it to the tab API."""
- type_map = {
- QWebEnginePage.NavigationTypeLinkClicked:
- usertypes.NavigationRequest.Type.link_clicked,
- QWebEnginePage.NavigationTypeTyped:
- usertypes.NavigationRequest.Type.typed,
- QWebEnginePage.NavigationTypeFormSubmitted:
- usertypes.NavigationRequest.Type.form_submitted,
- QWebEnginePage.NavigationTypeBackForward:
- usertypes.NavigationRequest.Type.back_forward,
- QWebEnginePage.NavigationTypeReload:
- usertypes.NavigationRequest.Type.reloaded,
- QWebEnginePage.NavigationTypeOther:
- usertypes.NavigationRequest.Type.other,
- }
- try:
- type_map[QWebEnginePage.NavigationTypeRedirect] = (
- usertypes.NavigationRequest.Type.redirect)
- except AttributeError:
- # Added in Qt 5.14
- pass
-
navigation = usertypes.NavigationRequest(
url=url,
- navigation_type=type_map.get(
+ navigation_type=self._NAVIGATION_TYPE_MAPPING.get(
typ, usertypes.NavigationRequest.Type.other),
is_main_frame=is_main_frame)
self.navigation_request.emit(navigation)