Simplify QtWebKit scheme handlers

This commit is contained in:
Florian Bruhin 2018-02-11 17:14:41 +01:00
parent c112290664
commit 3170e35b31
7 changed files with 48 additions and 142 deletions

View File

@ -25,7 +25,7 @@
import os import os
from qutebrowser.browser.webkit.network import schemehandler, networkreply from qutebrowser.browser.webkit.network import networkreply
from qutebrowser.utils import jinja from qutebrowser.utils import jinja
@ -111,27 +111,21 @@ def dirbrowser_html(path):
return html.encode('UTF-8', errors='xmlcharrefreplace') return html.encode('UTF-8', errors='xmlcharrefreplace')
class FileSchemeHandler(schemehandler.SchemeHandler): def handler(request):
"""Handler for a file:// URL.
"""Scheme handler for file: URLs.""" Args:
request: QNetworkRequest to answer to.
def createRequest(self, _op, request, _outgoing_data): Return:
"""Create a new request. A QNetworkReply for directories, None for files.
"""
Args: path = request.url().toLocalFile()
request: const QNetworkRequest & req try:
_op: Operation op if os.path.isdir(path):
_outgoing_data: QIODevice * outgoingData data = dirbrowser_html(path)
return networkreply.FixedDataNetworkReply(
Return: request, data, 'text/html')
A QNetworkReply for directories, None for files. return None
""" except UnicodeEncodeError:
path = request.url().toLocalFile() return None
try:
if os.path.isdir(path):
data = dirbrowser_html(path)
return networkreply.FixedDataNetworkReply(
request, data, 'text/html', self.parent())
return None
except UnicodeEncodeError:
return None

View File

@ -151,8 +151,8 @@ class NetworkManager(QNetworkAccessManager):
self._tab_id = tab_id self._tab_id = tab_id
self._private = private self._private = private
self._scheme_handlers = { self._scheme_handlers = {
'qute': webkitqutescheme.QuteSchemeHandler(), 'qute': webkitqutescheme.handler,
'file': filescheme.FileSchemeHandler(), 'file': filescheme.handler,
} }
self._set_cookiejar() self._set_cookiejar()
self._set_cache() self._set_cache()
@ -373,9 +373,9 @@ class NetworkManager(QNetworkAccessManager):
scheme = req.url().scheme() scheme = req.url().scheme()
if scheme in self._scheme_handlers: if scheme in self._scheme_handlers:
result = self._scheme_handlers[scheme].createRequest( result = self._scheme_handlers[scheme](req)
op, req, outgoing_data)
if result is not None: if result is not None:
result.setParent(self)
return result return result
for header, value in shared.custom_headers(): for header, value in shared.custom_headers():

View File

@ -1,43 +0,0 @@
# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et:
# Copyright 2014-2018 Florian Bruhin (The Compiler) <mail@qutebrowser.org>
#
# Based on the Eric5 helpviewer,
# Copyright (c) 2009 - 2014 Detlev Offenbach <detlev@die-offenbachs.de>
#
# This file is part of qutebrowser.
#
# qutebrowser is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# qutebrowser is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with qutebrowser. If not, see <http://www.gnu.org/licenses/>.
"""Base class for custom scheme handlers."""
from PyQt5.QtCore import QObject
class SchemeHandler(QObject):
"""Abstract base class for custom scheme handlers."""
def createRequest(self, op, request, outgoing_data):
"""Create a new request.
Args:
op: Operation op
req: const QNetworkRequest & req
outgoing_data: QIODevice * outgoingData
Return:
A QNetworkReply.
"""
raise NotImplementedError

View File

@ -24,46 +24,36 @@ import mimetypes
from PyQt5.QtNetwork import QNetworkReply from PyQt5.QtNetwork import QNetworkReply
from qutebrowser.browser import pdfjs, qutescheme from qutebrowser.browser import pdfjs, qutescheme
from qutebrowser.browser.webkit.network import schemehandler, networkreply from qutebrowser.browser.webkit.network import networkreply
from qutebrowser.utils import log, usertypes, qtutils from qutebrowser.utils import log, usertypes, qtutils
class QuteSchemeHandler(schemehandler.SchemeHandler): def handler(request):
"""Scheme handler for qute:// URLs.
"""Scheme handler for qute:// URLs.""" Args:
request: QNetworkRequest to answer to.
def createRequest(self, _op, request, _outgoing_data): Return:
"""Create a new request. A QNetworkReply.
"""
try:
mimetype, data = qutescheme.data_for_url(request.url())
except qutescheme.NoHandlerFound:
errorstr = "No handler found for {}!".format(
request.url().toDisplayString())
return networkreply.ErrorNetworkReply(
request, errorstr, QNetworkReply.ContentNotFoundError)
except qutescheme.QuteSchemeOSError as e:
return networkreply.ErrorNetworkReply(
request, str(e), QNetworkReply.ContentNotFoundError)
except qutescheme.QuteSchemeError as e:
return networkreply.ErrorNetworkReply(request, e.errorstring, e.error)
except qutescheme.Redirect as e:
qtutils.ensure_valid(e.url)
return networkreply.RedirectNetworkReply(e.url)
Args: return networkreply.FixedDataNetworkReply(request, data, mimetype)
request: const QNetworkRequest & req
_op: Operation op
_outgoing_data: QIODevice * outgoingData
Return:
A QNetworkReply.
"""
try:
mimetype, data = qutescheme.data_for_url(request.url())
except qutescheme.NoHandlerFound:
errorstr = "No handler found for {}!".format(
request.url().toDisplayString())
return networkreply.ErrorNetworkReply(
request, errorstr, QNetworkReply.ContentNotFoundError,
self.parent())
except qutescheme.QuteSchemeOSError as e:
return networkreply.ErrorNetworkReply(
request, str(e), QNetworkReply.ContentNotFoundError,
self.parent())
except qutescheme.QuteSchemeError as e:
return networkreply.ErrorNetworkReply(request, e.errorstring,
e.error, self.parent())
except qutescheme.Redirect as e:
qtutils.ensure_valid(e.url)
return networkreply.RedirectNetworkReply(e.url, self.parent())
return networkreply.FixedDataNetworkReply(request, data, mimetype,
self.parent())
@qutescheme.add_handler('pdfjs', backend=usertypes.Backend.QtWebKit) @qutescheme.add_handler('pdfjs', backend=usertypes.Backend.QtWebKit)

View File

@ -72,8 +72,6 @@ PERFECT_FILES = [
# 'browser/webkit/webkitelem.py'), # 'browser/webkit/webkitelem.py'),
# ('tests/unit/browser/webkit/test_webkitelem.py', # ('tests/unit/browser/webkit/test_webkitelem.py',
# 'browser/webelem.py'), # 'browser/webelem.py'),
('tests/unit/browser/webkit/network/test_schemehandler.py',
'browser/webkit/network/schemehandler.py'),
('tests/unit/browser/webkit/network/test_filescheme.py', ('tests/unit/browser/webkit/network/test_filescheme.py',
'browser/webkit/network/filescheme.py'), 'browser/webkit/network/filescheme.py'),
('tests/unit/browser/webkit/network/test_networkreply.py', ('tests/unit/browser/webkit/network/test_networkreply.py',

View File

@ -248,8 +248,7 @@ class TestFileSchemeHandler:
def test_dir(self, tmpdir): def test_dir(self, tmpdir):
url = QUrl.fromLocalFile(str(tmpdir)) url = QUrl.fromLocalFile(str(tmpdir))
req = QNetworkRequest(url) req = QNetworkRequest(url)
handler = filescheme.FileSchemeHandler() reply = filescheme.handler(req)
reply = handler.createRequest(None, req, None)
# The URL will always use /, even on Windows - so we force this here # The URL will always use /, even on Windows - so we force this here
# too. # too.
tmpdir_path = str(tmpdir).replace(os.sep, '/') tmpdir_path = str(tmpdir).replace(os.sep, '/')
@ -260,17 +259,15 @@ class TestFileSchemeHandler:
filename.ensure() filename.ensure()
url = QUrl.fromLocalFile(str(filename)) url = QUrl.fromLocalFile(str(filename))
req = QNetworkRequest(url) req = QNetworkRequest(url)
handler = filescheme.FileSchemeHandler() reply = filescheme.handler(req)
reply = handler.createRequest(None, req, None)
assert reply is None assert reply is None
def test_unicode_encode_error(self, mocker): def test_unicode_encode_error(self, mocker):
url = QUrl('file:///tmp/foo') url = QUrl('file:///tmp/foo')
req = QNetworkRequest(url) req = QNetworkRequest(url)
handler = filescheme.FileSchemeHandler()
err = UnicodeEncodeError('ascii', '', 0, 2, 'foo') err = UnicodeEncodeError('ascii', '', 0, 2, 'foo')
mocker.patch('os.path.isdir', side_effect=err) mocker.patch('os.path.isdir', side_effect=err)
reply = handler.createRequest(None, req, None) reply = filescheme.handler(req)
assert reply is None assert reply is None

View File

@ -1,30 +0,0 @@
# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et:
# Copyright 2015-2018 Florian Bruhin (The Compiler) <mail@qutebrowser.org>
#
# This file is part of qutebrowser.
#
# qutebrowser is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# qutebrowser is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with qutebrowser. If not, see <http://www.gnu.org/licenses/>.
"""Tests for browser.network.schemehandler."""
import pytest
from qutebrowser.browser.webkit.network import schemehandler
def test_create_request():
handler = schemehandler.SchemeHandler(0)
with pytest.raises(NotImplementedError):
handler.createRequest(None, None, None)