diff --git a/qutebrowser/browser/qutescheme.py b/qutebrowser/browser/qutescheme.py index 0880a247c..e8a9fe8a2 100644 --- a/qutebrowser/browser/qutescheme.py +++ b/qutebrowser/browser/qutescheme.py @@ -35,7 +35,7 @@ import pkg_resources from PyQt5.QtCore import QUrlQuery, QUrl import qutebrowser -from qutebrowser.config import config +from qutebrowser.config import config, configdata, configexc from qutebrowser.utils import (version, utils, jinja, log, message, docutils, objreg, usertypes, qtutils) from qutebrowser.misc import objects @@ -441,3 +441,37 @@ def qute_backend_warning(_url): version=pkg_resources.parse_version, title="Legacy backend warning") return 'text/html', html + + +def _qute_settings_set(url): + """Handler for qute://settings/set.""" + query = QUrlQuery(url) + option = query.queryItemValue('option', QUrl.FullyDecoded) + value = query.queryItemValue('value', QUrl.FullyDecoded) + + # https://github.com/qutebrowser/qutebrowser/issues/727 + if option == 'content.javascript.enabled' and value == 'false': + msg = ("Refusing to disable javascript via qute://settings " + "as it needs javascript support.") + message.error(msg) + return 'text/html', b'error: ' + msg.encode('utf-8') + + try: + config.instance.set(option, value) + return 'text/html', b'ok' + except configexc.Error as e: + message.error(str(e)) + return 'text/html', b'error: ' + str(e).encode('utf-8') + + +@add_handler('settings') +def qute_settings(url): + """Handler for qute://settings. View/change qute configuration.""" + # FIXME:conf add a test for this + if url.path() == '/set': + return _qute_settings_set(url) + + config_getter = config.instance.get # FIXME to_str + html = jinja.render('settings.html', title='settings', + configdata=configdata, confget=config_getter) + return 'text/html', html diff --git a/qutebrowser/browser/webkit/network/webkitqutescheme.py b/qutebrowser/browser/webkit/network/webkitqutescheme.py index d7580cbee..806cdde33 100644 --- a/qutebrowser/browser/webkit/network/webkitqutescheme.py +++ b/qutebrowser/browser/webkit/network/webkitqutescheme.py @@ -20,16 +20,13 @@ """QtWebKit specific qute://* handlers and glue code.""" import mimetypes -import functools -import configparser -from PyQt5.QtCore import pyqtSlot, QObject +from PyQt5.QtCore import pyqtSlot from PyQt5.QtNetwork import QNetworkReply from qutebrowser.browser import pdfjs, qutescheme from qutebrowser.browser.webkit.network import schemehandler, networkreply -from qutebrowser.utils import jinja, log, message, objreg, usertypes, qtutils -from qutebrowser.config import configexc, configdata, config +from qutebrowser.utils import jinja, log, message, usertypes, qtutils class QuteSchemeHandler(schemehandler.SchemeHandler): @@ -70,36 +67,6 @@ class QuteSchemeHandler(schemehandler.SchemeHandler): self.parent()) -class JSBridge(QObject): - - """Javascript-bridge for special qute://... pages.""" - - @pyqtSlot(str, str, str) - def set(self, sectname, optname, value): - """Slot to set a setting from qute://settings.""" - # https://github.com/qutebrowser/qutebrowser/issues/727 - if ((sectname, optname) == ('content', 'allow-javascript') and - value == 'false'): - message.error("Refusing to disable javascript via qute://settings " - "as it needs javascript support.") - return - # FIXME:conf - message.error("Setting doesn't work yet!") - # try: - # objreg.get('config').set('conf', sectname, optname, value) - # except (configexc.Error, configparser.Error) as e: - # message.error(str(e)) - - -@qutescheme.add_handler('settings', backend=usertypes.Backend.QtWebKit) -def qute_settings(_url): - """Handler for qute://settings. View/change qute configuration.""" - config_getter = config.instance.get # FIXME to_str - html = jinja.render('settings.html', title='settings', - configdata=configdata, confget=config_getter) - return 'text/html', html - - @qutescheme.add_handler('pdfjs', backend=usertypes.Backend.QtWebKit) def qute_pdfjs(url): """Handler for qute://pdfjs. Return the pdf.js viewer.""" diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py index e901f3a46..b716f5ff7 100644 --- a/qutebrowser/browser/webkit/webkittab.py +++ b/qutebrowser/browser/webkit/webkittab.py @@ -35,23 +35,16 @@ from PyQt5.QtPrintSupport import QPrinter from qutebrowser.browser import browsertab from qutebrowser.browser.network import proxy from qutebrowser.browser.webkit import webview, tabhistory, webkitelem -from qutebrowser.browser.webkit.network import webkitqutescheme from qutebrowser.utils import qtutils, objreg, usertypes, utils, log, debug def init(): """Initialize QtWebKit-specific modules.""" - qapp = QApplication.instance() - if not qtutils.version_check('5.8'): # Otherwise we initialize it globally in app.py log.init.debug("Initializing proxy...") proxy.init() - log.init.debug("Initializing js-bridge...") - js_bridge = webkitqutescheme.JSBridge(qapp) - objreg.register('js-bridge', js_bridge) - class WebKitAction(browsertab.AbstractAction): diff --git a/qutebrowser/browser/webkit/webview.py b/qutebrowser/browser/webkit/webview.py index c3f9abd0e..ab7805213 100644 --- a/qutebrowser/browser/webkit/webview.py +++ b/qutebrowser/browser/webkit/webview.py @@ -135,22 +135,6 @@ class WebView(QWebView): url: The URL to load as QUrl """ self.load(url) - if url.scheme() == 'qute': - frame = self.page().mainFrame() - frame.javaScriptWindowObjectCleared.connect(self.add_js_bridge) - - @pyqtSlot() - def add_js_bridge(self): - """Add the javascript bridge for qute://... pages.""" - frame = self.sender() - if not isinstance(frame, QWebFrame): - log.webview.error("Got non-QWebFrame {!r} in " - "add_js_bridge!".format(frame)) - return - - if frame.url().scheme() == 'qute': - bridge = objreg.get('js-bridge') - frame.addToJavaScriptWindowObject('qute', bridge) @pyqtSlot(usertypes.KeyMode) def on_mode_entered(self, mode): diff --git a/qutebrowser/config/newconfig.py b/qutebrowser/config/newconfig.py index b07e1abc9..b82fe5b9e 100644 --- a/qutebrowser/config/newconfig.py +++ b/qutebrowser/config/newconfig.py @@ -131,6 +131,9 @@ class NewConfigManager(QObject): raise configexc.NoOptionError(option) return value.typ.from_py(value.default) + def set(self, option, value): + raise configexc.Error("Setting doesn't work yet!") + class ConfigContainer: diff --git a/qutebrowser/html/settings.html b/qutebrowser/html/settings.html index 8ca4528db..dfb02bc80 100644 --- a/qutebrowser/html/settings.html +++ b/qutebrowser/html/settings.html @@ -1,9 +1,13 @@ {% extends "base.html" %} {% block script %} -var cset = function(section, option, el) { - value = el.value; - window.qute.set(section, option, value); +var cset = function(option, value) { + // FIXME:conf we might want some error handling here? + var url = "qute://settings/set?option=" + encodeURIComponent(option); + url += "&value=" + encodeURIComponent(value); + var xhr = new XMLHttpRequest(); + xhr.open("GET", url); + xhr.send(); } {% endblock %} @@ -32,7 +36,7 @@ th pre { color: grey; text-align: left; }