diff options
Diffstat (limited to 'qutebrowser/browser/webengine/webview.py')
-rw-r--r-- | qutebrowser/browser/webengine/webview.py | 100 |
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) |