Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Make qute://settings work with QtWebEngine and new config
Fixes #2332
  • Loading branch information
The-Compiler committed Jul 4, 2017
1 parent fede64b commit ffc29ee
Show file tree
Hide file tree
Showing 6 changed files with 48 additions and 63 deletions.
36 changes: 35 additions & 1 deletion qutebrowser/browser/qutescheme.py
Expand Up @@ -35,7 +35,7 @@
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
Expand Down Expand Up @@ -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):

This comment was marked as spam.

Copy link
@bushuevky

bushuevky Dec 4, 2019

bushuev.byshyi

This comment was marked as spam.

Copy link
@bushuevky

bushuevky Dec 4, 2019

bushuev.byshyi

"""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
37 changes: 2 additions & 35 deletions qutebrowser/browser/webkit/network/webkitqutescheme.py
Expand Up @@ -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):
Expand Down Expand Up @@ -70,36 +67,6 @@ def createRequest(self, _op, request, _outgoing_data):
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."""
Expand Down
7 changes: 0 additions & 7 deletions qutebrowser/browser/webkit/webkittab.py
Expand Up @@ -35,23 +35,16 @@
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):

Expand Down
16 changes: 0 additions & 16 deletions qutebrowser/browser/webkit/webview.py
Expand Up @@ -135,22 +135,6 @@ def openurl(self, url):
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):
Expand Down
3 changes: 3 additions & 0 deletions qutebrowser/config/newconfig.py
Expand Up @@ -131,6 +131,9 @@ def get(self, option):
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:

Expand Down
12 changes: 8 additions & 4 deletions 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 %}

Expand Down Expand Up @@ -32,7 +36,7 @@
</td>
<td>
<input type="text"
onblur="cset('{{ option.name }}', this)"
onblur="cset('{{ option.name }}', this.value)"
value="{{ confget(option.name) }}">
</input>
</td>
Expand Down

0 comments on commit ffc29ee

Please sign in to comment.