summaryrefslogtreecommitdiff
path: root/qutebrowser/browser/webkit/webpage.py
diff options
context:
space:
mode:
Diffstat (limited to 'qutebrowser/browser/webkit/webpage.py')
-rw-r--r--qutebrowser/browser/webkit/webpage.py100
1 files changed, 47 insertions, 53 deletions
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()