From c5b7ed350e4d6b27e82755f6b3f67a01b7b9ae2b Mon Sep 17 00:00:00 2001
From: Florian Bruhin <git@the-compiler.org>
Date: Mon, 11 Jun 2018 19:14:31 +0200
Subject: [PATCH] Make it possible to provide a converter for websettings

---
 .../browser/webengine/webenginesettings.py    | 31 ++++++-------
 qutebrowser/browser/webkit/webkitsettings.py  | 43 ++++++++++---------
 qutebrowser/config/websettings.py             | 20 +++++++--
 3 files changed, 55 insertions(+), 39 deletions(-)

diff --git a/qutebrowser/browser/webengine/webenginesettings.py b/qutebrowser/browser/webengine/webenginesettings.py
index 3a5e138d3..6492e6828 100644
--- a/qutebrowser/browser/webengine/webenginesettings.py
+++ b/qutebrowser/browser/webengine/webenginesettings.py
@@ -32,6 +32,7 @@ from PyQt5.QtWebEngineWidgets import (QWebEngineSettings, QWebEngineProfile,
 
 from qutebrowser.browser.webengine import spell
 from qutebrowser.config import config, websettings
+from qutebrowser.config.websettings import AttributeInfo as Attr
 from qutebrowser.utils import utils, standarddir, qtutils, message, log
 
 # The default QWebEngineProfile
@@ -88,35 +89,35 @@ class WebEngineSettings(websettings.AbstractSettings):
 
     _ATTRIBUTES = {
         'content.xss_auditing':
-            [QWebEngineSettings.XSSAuditingEnabled],
+            Attr(QWebEngineSettings.XSSAuditingEnabled),
         'content.images':
-            [QWebEngineSettings.AutoLoadImages],
+            Attr(QWebEngineSettings.AutoLoadImages),
         'content.javascript.enabled':
-            [QWebEngineSettings.JavascriptEnabled],
+            Attr(QWebEngineSettings.JavascriptEnabled),
         'content.javascript.can_open_tabs_automatically':
-            [QWebEngineSettings.JavascriptCanOpenWindows],
+            Attr(QWebEngineSettings.JavascriptCanOpenWindows),
         'content.javascript.can_access_clipboard':
-            [QWebEngineSettings.JavascriptCanAccessClipboard],
+            Attr(QWebEngineSettings.JavascriptCanAccessClipboard),
         'content.plugins':
-            [QWebEngineSettings.PluginsEnabled],
+            Attr(QWebEngineSettings.PluginsEnabled),
         'content.hyperlink_auditing':
-            [QWebEngineSettings.HyperlinkAuditingEnabled],
+            Attr(QWebEngineSettings.HyperlinkAuditingEnabled),
         'content.local_content_can_access_remote_urls':
-            [QWebEngineSettings.LocalContentCanAccessRemoteUrls],
+            Attr(QWebEngineSettings.LocalContentCanAccessRemoteUrls),
         'content.local_content_can_access_file_urls':
-            [QWebEngineSettings.LocalContentCanAccessFileUrls],
+            Attr(QWebEngineSettings.LocalContentCanAccessFileUrls),
         'content.webgl':
-            [QWebEngineSettings.WebGLEnabled],
+            Attr(QWebEngineSettings.WebGLEnabled),
         'content.local_storage':
-            [QWebEngineSettings.LocalStorageEnabled],
+            Attr(QWebEngineSettings.LocalStorageEnabled),
 
         'input.spatial_navigation':
-            [QWebEngineSettings.SpatialNavigationEnabled],
+            Attr(QWebEngineSettings.SpatialNavigationEnabled),
         'input.links_included_in_focus_chain':
-            [QWebEngineSettings.LinksIncludedInFocusChain],
+            Attr(QWebEngineSettings.LinksIncludedInFocusChain),
 
         'scrolling.smooth':
-            [QWebEngineSettings.ScrollAnimatorEnabled],
+            Attr(QWebEngineSettings.ScrollAnimatorEnabled),
     }
 
     _FONT_SIZES = {
@@ -163,7 +164,7 @@ class WebEngineSettings(websettings.AbstractSettings):
             except AttributeError:
                 continue
 
-            self._ATTRIBUTES[name] = [value]
+            self._ATTRIBUTES[name] = Attr(value)
 
 
 class ProfileSetter:
diff --git a/qutebrowser/browser/webkit/webkitsettings.py b/qutebrowser/browser/webkit/webkitsettings.py
index 5a6484fcd..cce1dcec0 100644
--- a/qutebrowser/browser/webkit/webkitsettings.py
+++ b/qutebrowser/browser/webkit/webkitsettings.py
@@ -30,6 +30,7 @@ from PyQt5.QtGui import QFont
 from PyQt5.QtWebKit import QWebSettings
 
 from qutebrowser.config import config, websettings
+from qutebrowser.config.websettings import AttributeInfo as Attr
 from qutebrowser.utils import standarddir, urlutils
 from qutebrowser.browser import shared
 
@@ -44,48 +45,48 @@ class WebKitSettings(websettings.AbstractSettings):
 
     _ATTRIBUTES = {
         'content.images':
-            [QWebSettings.AutoLoadImages],
+            Attr(QWebSettings.AutoLoadImages),
         'content.javascript.enabled':
-            [QWebSettings.JavascriptEnabled],
+            Attr(QWebSettings.JavascriptEnabled),
         'content.javascript.can_open_tabs_automatically':
-            [QWebSettings.JavascriptCanOpenWindows],
+            Attr(QWebSettings.JavascriptCanOpenWindows),
         'content.javascript.can_close_tabs':
-            [QWebSettings.JavascriptCanCloseWindows],
+            Attr(QWebSettings.JavascriptCanCloseWindows),
         'content.javascript.can_access_clipboard':
-            [QWebSettings.JavascriptCanAccessClipboard],
+            Attr(QWebSettings.JavascriptCanAccessClipboard),
         'content.plugins':
-            [QWebSettings.PluginsEnabled],
+            Attr(QWebSettings.PluginsEnabled),
         'content.webgl':
-            [QWebSettings.WebGLEnabled],
+            Attr(QWebSettings.WebGLEnabled),
         'content.hyperlink_auditing':
-            [QWebSettings.HyperlinkAuditingEnabled],
+            Attr(QWebSettings.HyperlinkAuditingEnabled),
         'content.local_content_can_access_remote_urls':
-            [QWebSettings.LocalContentCanAccessRemoteUrls],
+            Attr(QWebSettings.LocalContentCanAccessRemoteUrls),
         'content.local_content_can_access_file_urls':
-            [QWebSettings.LocalContentCanAccessFileUrls],
+            Attr(QWebSettings.LocalContentCanAccessFileUrls),
         'content.dns_prefetch':
-            [QWebSettings.DnsPrefetchEnabled],
+            Attr(QWebSettings.DnsPrefetchEnabled),
         'content.frame_flattening':
-            [QWebSettings.FrameFlatteningEnabled],
+            Attr(QWebSettings.FrameFlatteningEnabled),
         'content.cache.appcache':
-            [QWebSettings.OfflineWebApplicationCacheEnabled],
+            Attr(QWebSettings.OfflineWebApplicationCacheEnabled),
         'content.local_storage':
-            [QWebSettings.LocalStorageEnabled,
-             QWebSettings.OfflineStorageDatabaseEnabled],
+            Attr(QWebSettings.LocalStorageEnabled,
+                 QWebSettings.OfflineStorageDatabaseEnabled),
         'content.print_element_backgrounds':
-            [QWebSettings.PrintElementBackgrounds],
+            Attr(QWebSettings.PrintElementBackgrounds),
         'content.xss_auditing':
-            [QWebSettings.XSSAuditingEnabled],
+            Attr(QWebSettings.XSSAuditingEnabled),
 
         'input.spatial_navigation':
-            [QWebSettings.SpatialNavigationEnabled],
+            Attr(QWebSettings.SpatialNavigationEnabled),
         'input.links_included_in_focus_chain':
-            [QWebSettings.LinksIncludedInFocusChain],
+            Attr(QWebSettings.LinksIncludedInFocusChain),
 
         'zoom.text_only':
-            [QWebSettings.ZoomTextOnly],
+            Attr(QWebSettings.ZoomTextOnly),
         'scrolling.smooth':
-            [QWebSettings.ScrollAnimatorEnabled],
+            Attr(QWebSettings.ScrollAnimatorEnabled),
     }
 
     _FONT_SIZES = {
diff --git a/qutebrowser/config/websettings.py b/qutebrowser/config/websettings.py
index cfb53e658..fb80c543b 100644
--- a/qutebrowser/config/websettings.py
+++ b/qutebrowser/config/websettings.py
@@ -28,6 +28,18 @@ from qutebrowser.misc import objects
 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:
 
     """Abstract base class for settings set via QWeb(Engine)Settings."""
@@ -50,12 +62,13 @@ class AbstractSettings:
         """
         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:
                 self._settings.resetAttribute(attribute)
                 new_value = self.test_attribute(name)
             else:
-                self._settings.setAttribute(attribute, value)
+                self._settings.setAttribute(attribute, info.converter(value))
                 new_value = value
 
         return old_value != new_value
@@ -66,7 +79,8 @@ class AbstractSettings:
         If the setting resolves to a list of attributes, only the first
         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):
         """Set the given QWebSettings/QWebEngineSettings font size.