Make it possible to provide a converter for websettings

This commit is contained in:
Florian Bruhin 2018-06-11 19:14:31 +02:00
parent b7c1d7fe37
commit c5b7ed350e
3 changed files with 55 additions and 39 deletions

View File

@ -32,6 +32,7 @@ from PyQt5.QtWebEngineWidgets import (QWebEngineSettings, QWebEngineProfile,
from qutebrowser.browser.webengine import spell from qutebrowser.browser.webengine import spell
from qutebrowser.config import config, websettings from qutebrowser.config import config, websettings
from qutebrowser.config.websettings import AttributeInfo as Attr
from qutebrowser.utils import utils, standarddir, qtutils, message, log from qutebrowser.utils import utils, standarddir, qtutils, message, log
# The default QWebEngineProfile # The default QWebEngineProfile
@ -88,35 +89,35 @@ class WebEngineSettings(websettings.AbstractSettings):
_ATTRIBUTES = { _ATTRIBUTES = {
'content.xss_auditing': 'content.xss_auditing':
[QWebEngineSettings.XSSAuditingEnabled], Attr(QWebEngineSettings.XSSAuditingEnabled),
'content.images': 'content.images':
[QWebEngineSettings.AutoLoadImages], Attr(QWebEngineSettings.AutoLoadImages),
'content.javascript.enabled': 'content.javascript.enabled':
[QWebEngineSettings.JavascriptEnabled], Attr(QWebEngineSettings.JavascriptEnabled),
'content.javascript.can_open_tabs_automatically': 'content.javascript.can_open_tabs_automatically':
[QWebEngineSettings.JavascriptCanOpenWindows], Attr(QWebEngineSettings.JavascriptCanOpenWindows),
'content.javascript.can_access_clipboard': 'content.javascript.can_access_clipboard':
[QWebEngineSettings.JavascriptCanAccessClipboard], Attr(QWebEngineSettings.JavascriptCanAccessClipboard),
'content.plugins': 'content.plugins':
[QWebEngineSettings.PluginsEnabled], Attr(QWebEngineSettings.PluginsEnabled),
'content.hyperlink_auditing': 'content.hyperlink_auditing':
[QWebEngineSettings.HyperlinkAuditingEnabled], Attr(QWebEngineSettings.HyperlinkAuditingEnabled),
'content.local_content_can_access_remote_urls': 'content.local_content_can_access_remote_urls':
[QWebEngineSettings.LocalContentCanAccessRemoteUrls], Attr(QWebEngineSettings.LocalContentCanAccessRemoteUrls),
'content.local_content_can_access_file_urls': 'content.local_content_can_access_file_urls':
[QWebEngineSettings.LocalContentCanAccessFileUrls], Attr(QWebEngineSettings.LocalContentCanAccessFileUrls),
'content.webgl': 'content.webgl':
[QWebEngineSettings.WebGLEnabled], Attr(QWebEngineSettings.WebGLEnabled),
'content.local_storage': 'content.local_storage':
[QWebEngineSettings.LocalStorageEnabled], Attr(QWebEngineSettings.LocalStorageEnabled),
'input.spatial_navigation': 'input.spatial_navigation':
[QWebEngineSettings.SpatialNavigationEnabled], Attr(QWebEngineSettings.SpatialNavigationEnabled),
'input.links_included_in_focus_chain': 'input.links_included_in_focus_chain':
[QWebEngineSettings.LinksIncludedInFocusChain], Attr(QWebEngineSettings.LinksIncludedInFocusChain),
'scrolling.smooth': 'scrolling.smooth':
[QWebEngineSettings.ScrollAnimatorEnabled], Attr(QWebEngineSettings.ScrollAnimatorEnabled),
} }
_FONT_SIZES = { _FONT_SIZES = {
@ -163,7 +164,7 @@ class WebEngineSettings(websettings.AbstractSettings):
except AttributeError: except AttributeError:
continue continue
self._ATTRIBUTES[name] = [value] self._ATTRIBUTES[name] = Attr(value)
class ProfileSetter: class ProfileSetter:

View File

@ -30,6 +30,7 @@ from PyQt5.QtGui import QFont
from PyQt5.QtWebKit import QWebSettings from PyQt5.QtWebKit import QWebSettings
from qutebrowser.config import config, websettings from qutebrowser.config import config, websettings
from qutebrowser.config.websettings import AttributeInfo as Attr
from qutebrowser.utils import standarddir, urlutils from qutebrowser.utils import standarddir, urlutils
from qutebrowser.browser import shared from qutebrowser.browser import shared
@ -44,48 +45,48 @@ class WebKitSettings(websettings.AbstractSettings):
_ATTRIBUTES = { _ATTRIBUTES = {
'content.images': 'content.images':
[QWebSettings.AutoLoadImages], Attr(QWebSettings.AutoLoadImages),
'content.javascript.enabled': 'content.javascript.enabled':
[QWebSettings.JavascriptEnabled], Attr(QWebSettings.JavascriptEnabled),
'content.javascript.can_open_tabs_automatically': 'content.javascript.can_open_tabs_automatically':
[QWebSettings.JavascriptCanOpenWindows], Attr(QWebSettings.JavascriptCanOpenWindows),
'content.javascript.can_close_tabs': 'content.javascript.can_close_tabs':
[QWebSettings.JavascriptCanCloseWindows], Attr(QWebSettings.JavascriptCanCloseWindows),
'content.javascript.can_access_clipboard': 'content.javascript.can_access_clipboard':
[QWebSettings.JavascriptCanAccessClipboard], Attr(QWebSettings.JavascriptCanAccessClipboard),
'content.plugins': 'content.plugins':
[QWebSettings.PluginsEnabled], Attr(QWebSettings.PluginsEnabled),
'content.webgl': 'content.webgl':
[QWebSettings.WebGLEnabled], Attr(QWebSettings.WebGLEnabled),
'content.hyperlink_auditing': 'content.hyperlink_auditing':
[QWebSettings.HyperlinkAuditingEnabled], Attr(QWebSettings.HyperlinkAuditingEnabled),
'content.local_content_can_access_remote_urls': 'content.local_content_can_access_remote_urls':
[QWebSettings.LocalContentCanAccessRemoteUrls], Attr(QWebSettings.LocalContentCanAccessRemoteUrls),
'content.local_content_can_access_file_urls': 'content.local_content_can_access_file_urls':
[QWebSettings.LocalContentCanAccessFileUrls], Attr(QWebSettings.LocalContentCanAccessFileUrls),
'content.dns_prefetch': 'content.dns_prefetch':
[QWebSettings.DnsPrefetchEnabled], Attr(QWebSettings.DnsPrefetchEnabled),
'content.frame_flattening': 'content.frame_flattening':
[QWebSettings.FrameFlatteningEnabled], Attr(QWebSettings.FrameFlatteningEnabled),
'content.cache.appcache': 'content.cache.appcache':
[QWebSettings.OfflineWebApplicationCacheEnabled], Attr(QWebSettings.OfflineWebApplicationCacheEnabled),
'content.local_storage': 'content.local_storage':
[QWebSettings.LocalStorageEnabled, Attr(QWebSettings.LocalStorageEnabled,
QWebSettings.OfflineStorageDatabaseEnabled], QWebSettings.OfflineStorageDatabaseEnabled),
'content.print_element_backgrounds': 'content.print_element_backgrounds':
[QWebSettings.PrintElementBackgrounds], Attr(QWebSettings.PrintElementBackgrounds),
'content.xss_auditing': 'content.xss_auditing':
[QWebSettings.XSSAuditingEnabled], Attr(QWebSettings.XSSAuditingEnabled),
'input.spatial_navigation': 'input.spatial_navigation':
[QWebSettings.SpatialNavigationEnabled], Attr(QWebSettings.SpatialNavigationEnabled),
'input.links_included_in_focus_chain': 'input.links_included_in_focus_chain':
[QWebSettings.LinksIncludedInFocusChain], Attr(QWebSettings.LinksIncludedInFocusChain),
'zoom.text_only': 'zoom.text_only':
[QWebSettings.ZoomTextOnly], Attr(QWebSettings.ZoomTextOnly),
'scrolling.smooth': 'scrolling.smooth':
[QWebSettings.ScrollAnimatorEnabled], Attr(QWebSettings.ScrollAnimatorEnabled),
} }
_FONT_SIZES = { _FONT_SIZES = {

View File

@ -28,6 +28,18 @@ from qutebrowser.misc import objects
UNSET = object() UNSET = object()
class AttributeInfo:
"""Info about a settings attribute."""
def __init__(self, *attributes, converter=None):
self.attributes = attributes
if converter is None:
self.converter = lambda val: val
else:
self.converter = converter
class AbstractSettings: class AbstractSettings:
"""Abstract base class for settings set via QWeb(Engine)Settings.""" """Abstract base class for settings set via QWeb(Engine)Settings."""
@ -50,12 +62,13 @@ class AbstractSettings:
""" """
old_value = self.test_attribute(name) old_value = self.test_attribute(name)
for attribute in self._ATTRIBUTES[name]: info = self._ATTRIBUTES[name]
for attribute in info.attributes:
if value is configutils.UNSET: if value is configutils.UNSET:
self._settings.resetAttribute(attribute) self._settings.resetAttribute(attribute)
new_value = self.test_attribute(name) new_value = self.test_attribute(name)
else: else:
self._settings.setAttribute(attribute, value) self._settings.setAttribute(attribute, info.converter(value))
new_value = value new_value = value
return old_value != new_value return old_value != new_value
@ -66,7 +79,8 @@ class AbstractSettings:
If the setting resolves to a list of attributes, only the first If the setting resolves to a list of attributes, only the first
attribute is tested. attribute is tested.
""" """
return self._settings.testAttribute(self._ATTRIBUTES[name][0]) info = self._ATTRIBUTES[name]
return self._settings.testAttribute(info.attributes[0])
def set_font_size(self, name, value): def set_font_size(self, name, value):
"""Set the given QWebSettings/QWebEngineSettings font size. """Set the given QWebSettings/QWebEngineSettings font size.