Allow to restrict qute:* pages to a backend

This commit is contained in:
Florian Bruhin 2016-09-14 11:04:47 +02:00
parent 71bc5bb943
commit a1527f35d4
3 changed files with 37 additions and 27 deletions

View File

@ -52,10 +52,6 @@ class QuteSchemeOSError(Exception):
pass pass
def add_handler(name):
"""Add a handler to the qute: scheme."""
def namedecorator(function):
_HANDLERS[name] = function
class QuteSchemeError(Exception): class QuteSchemeError(Exception):
"""Exception to signal that a handler should return an ErrorReply. """Exception to signal that a handler should return an ErrorReply.
@ -74,8 +70,40 @@ class QuteSchemeError(Exception):
super().__init__(errorstring) super().__init__(errorstring)
class add_handler: # pylint: disable=invalid-name
"""Decorator to register a qute:* URL handler.
Attributes:
_name: The 'foo' part of qute:foo
backend: Limit which backends the handler can run with.
"""
def __init__(self, name, backend=None):
self._name = name
self._backend = backend
self._function = None
def __call__(self, function):
self._function = function
_HANDLERS[self._name] = self.wrapper
return function return function
return namedecorator
def wrapper(self, *args, **kwargs):
used_backend = usertypes.arg2backend[objreg.get('args').backend]
if self._backend is not None and used_backend != self._backend:
return self.wrong_backend_handler(*args, **kwargs)
else:
return self._function(*args, **kwargs)
def wrong_backend_handler(self, url):
html = jinja.render('error.html',
title="Error while opening qute:url",
url=url.toDisplayString(),
error='{} is not available with this '
'backend'.format(url.toDisplayString()),
icon='')
return html.encode('UTF-8', errors='xmlcharrefreplace')
def data_for_url(url): def data_for_url(url):

View File

@ -56,7 +56,7 @@ class QuteSchemeHandler(QWebEngineUrlSchemeHandler):
# FIXME:qtwebengine how do we show a better error here? # FIXME:qtwebengine how do we show a better error here?
log.misc.exception("OSError while handling qute:* URL") log.misc.exception("OSError while handling qute:* URL")
job.fail(QWebEngineUrlRequestJob.UrlNotFound) job.fail(QWebEngineUrlRequestJob.UrlNotFound)
except QuteSchemeError as e: except qutescheme.QuteSchemeError as e:
# FIXME:qtwebengine how do we show a better error here? # FIXME:qtwebengine how do we show a better error here?
log.misc.exception("Error while handling qute:* URL") log.misc.exception("Error while handling qute:* URL")
job.fail(QWebEngineUrlRequestJob.RequestFailed) job.fail(QWebEngineUrlRequestJob.RequestFailed)

View File

@ -27,28 +27,10 @@ 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 schemehandler, networkreply
from qutebrowser.utils import jinja, log, message, objreg from qutebrowser.utils import jinja, log, message, objreg, usertypes
from qutebrowser.config import configexc, configdata from qutebrowser.config import configexc, configdata
class QuteSchemeError(Exception):
"""Exception to signal that a handler should return an ErrorReply.
Attributes correspond to the arguments in
networkreply.ErrorNetworkReply.
Attributes:
errorstring: Error string to print.
error: Numerical error value.
"""
def __init__(self, errorstring, error):
self.errorstring = errorstring
self.error = error
super().__init__(errorstring)
class QuteSchemeHandler(schemehandler.SchemeHandler): class QuteSchemeHandler(schemehandler.SchemeHandler):
"""Scheme handler for qute: URLs.""" """Scheme handler for qute: URLs."""
@ -103,7 +85,7 @@ class JSBridge(QObject):
message.error('current', e) message.error('current', e)
@qutescheme.add_handler('settings') @qutescheme.add_handler('settings', backend=usertypes.Backend.QtWebKit)
def qute_settings(_url): def qute_settings(_url):
"""Handler for qute:settings. View/change qute configuration.""" """Handler for qute:settings. View/change qute configuration."""
config_getter = functools.partial(objreg.get('config').get, raw=True) config_getter = functools.partial(objreg.get('config').get, raw=True)
@ -112,7 +94,7 @@ def qute_settings(_url):
return html.encode('UTF-8', errors='xmlcharrefreplace') return html.encode('UTF-8', errors='xmlcharrefreplace')
@qutescheme.add_handler('pdfjs') @qutescheme.add_handler('pdfjs', backend=usertypes.Backend.QtWebKit)
def qute_pdfjs(url): def qute_pdfjs(url):
"""Handler for qute://pdfjs. Return the pdf.js viewer.""" """Handler for qute://pdfjs. Return the pdf.js viewer."""
try: try: